Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/javascript/477.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/backbone.js/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Javascript 主干模型阵列属性更改和更改事件侦听器不总是触发_Javascript_Backbone.js - Fatal编程技术网

Javascript 主干模型阵列属性更改和更改事件侦听器不总是触发

Javascript 主干模型阵列属性更改和更改事件侦听器不总是触发,javascript,backbone.js,Javascript,Backbone.js,我在主干中发现了一些奇怪的变化事件。 它是一个以数组为属性的模型。 如果我得到属性,在里面推一个新值,并将其设置回模型,则不会触发更改事件 下面是一个完整的文档化示例: var TestModel = Backbone.Model.extend({ defaults : { numbers : [] }, initialize : function() { this.on('change:numbers', this.changedEve

我在主干中发现了一些奇怪的变化事件。 它是一个以数组为属性的模型。 如果我得到属性,在里面推一个新值,并将其设置回模型,则不会触发更改事件

下面是一个完整的文档化示例:

var TestModel = Backbone.Model.extend({
    defaults : {
        numbers : []
    },

    initialize : function() {
        this.on('change:numbers', this.changedEvent);
    },

    changedEvent : function() {
        console.log('model has changed');
    }
});

var oTestModel = new TestModel();
    oTestModel.set('numbers', [2, 3, 4]);    // change:numbers Event is fired

var aNumbers = oTestModel.get('numbers');
    aNumbers.push(5);

oTestModel.set('numbers', aNumbers);    // change:numbers event is NOT fired BUT WHY???

// oTestModel.set('numbers', [2, 3, 4]); 
// If this line is not commented out change:numbers event is also fired

console.log(oTestModel.toJSON());  // Dumps out [2,3,4,5] Respective [2,3,4] if line above is not commented out

提前Thx。

JavaScript中的数组被视为指针,因此改变数组不会更改指针,也不会触发“更改”事件。相反,您需要设置一个方法,在该方法中对数组进行变异,并在该方法中触发您自己的自定义事件。例如:


mutateArray: function() {
    var numbers = this.get("numbers");
    numbers.push(5);
    this.trigger("mutatedarray");
    return this;
}
注意,因为数字是一个指针,所以调用set(不是双关语)是没有意义的,因为数字只是对数组的引用。然后,您可以通过如下方式侦听自定义mutatedarray事件来侦听更改:


this.on("mutatedarray", this.changedEvent, this);

hesson在以下方面绝对正确:


JavaScript中的数组被视为指针,因此改变数组不会改变指针,也不会触发“更改”事件

但是,作为替代解决方案(如果您也使用下划线.js),您只需执行以下操作:

var aNumbers = _.clone(oTestModel.get('numbers'));
aNumbers.push(5);

oTestModel.set('numbers', aNumbers); //Will trigger the changed:numbers event
从这个类似问题的答案中可以看出:


这将复制对象,而不是将其作为引用,但是嵌套对象或数组将仅作为引用。

感谢您帮助我在大型对象上使用
是否会显著提高性能?是的,因为您正在添加自定义代码来解决此问题,最好添加触发事件的代码:
oTestModel.trigger('change:numbers',oTestModel,aNumbers)
根据您的事件订阅者,您可能还需要触发常规的“change”事件
oTestModel.trigger('change',oTestModel)
,或者两者都触发才能安全。