gpt4 book ai didi

angularjs - DisableSingleInstance 模式下 Parse JS SDK 对象的 angular.copy 返回空对象

转载 作者:行者123 更新时间:2023-12-01 01:52:09 24 4
gpt4 key购买 nike

不确定它是一个错误还是对事物如何工作的误解:

  • 禁用单实例模式
  • 创建一个新的解析对象(或从服务器查询一个)并填充属性
  • 制作对象的副本(例如,如果您正在编辑表单上的属性并想要保存/放弃更改的选项)
  • 副本为空....

  • 使用 parse-js-sdk 1.9.2 和 angular 1.4.8
      //comment out the following line and it works ok
    Parse.Object.disableSingleInstance();

    var parseObjClass = Parse.Object.extend('Comments', {
    // Instance methods
    initialize: function (attrs, options) {}
    },
    {});

    ['name', 'desc'].forEach(function (item) {

    Object.defineProperty(parseObjClass.prototype, item, {
    get: function () {
    return this.get(item);
    },
    set: function (aValue) {
    return this.set(item, aValue);
    }
    });
    });

    var parseObj = new parseObjClass();
    parseObj.name = 'Hello World'
    parseObj.desc = 'Test Object'

    console.log('original is ' + JSON.stringify(parseObj));
    //--> original is {"name":"Hello World","desc":"Test Object"}

    var objCopy = angular.copy(parseObj);

    console.log('copy is ' + JSON.stringify(objCopy));
    //--> copy is {}

    这是一个说明 https://plnkr.co/edit/UjWe9dl6D6Qkx9ihBSMC 的 plunker

    背景:我们正在使用 disableSingleInstance 模式,因为我们有一个移动应用程序和一个 Web 应用程序,它们可以与相同的数据库行(时间表数据)进行交互,并且在 js-sdk 并不总是拥有最新版本的数据时遇到问题......

    最佳答案

    根据 angular.copy(source, [destination]); docs :

    Only enumerable properties are taken into account. Non-enumerable properties (both on source and on destination) will be ignored.



    根据 MDN docs for Object.defineProperty(obj, prop, descriptor) :

    默认情况下定义这样的属性时,它是不可枚举的。因此,您必须指定 enumerable: truedescriptor .

    例如:
    Object.defineProperty(parseObjClass.prototype, item, {
    enumerable: true,
    get: function () {
    return this.get(item);
    },
    set: function (aValue) {
    return this.set(item, aValue);
    }
    });

    更新

    才发现你的 setter有问题和 getter您使用它的方式会阻止您的属性(property)成为可枚举的。
    您可以删除 get 和 set 并替换为可写的,它应该没问题。
    Object.defineProperty(parseObjClass.prototype, item, {
    enumerable: true,
    writable: true
    });

    如果您需要使用 getset您必须使用私有(private) var 或其他中间值,例如 get: () => _props[item];

    关于angularjs - DisableSingleInstance 模式下 Parse JS SDK 对象的 angular.copy 返回空对象,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/43582129/

    24 4 0
    Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
    广告合作:1813099741@qq.com 6ren.com