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
Events backbonejs model.set,在任何情况下触发事件_Events_Backbone.js - Fatal编程技术网

Events backbonejs model.set,在任何情况下触发事件

Events backbonejs model.set,在任何情况下触发事件,events,backbone.js,Events,Backbone.js,是否有一种方法可以强制更改:即使属性数据没有更改,也可以使用model.set()触发属性事件 model.set('attribute', 2); // will trigger the change:attribute event model.set('attribute', 2); // will not trigger again since the value has not changed 那么,即使值没有改变,有没有办法触发第二个集合? 谢谢您的时间。如果不覆盖主干网.Model

是否有一种方法可以强制更改:即使属性数据没有更改,也可以使用model.set()触发属性事件

model.set('attribute', 2); // will trigger the change:attribute event
model.set('attribute', 2); // will not trigger again since the value has not changed
那么,即使值没有改变,有没有办法触发第二个集合?
谢谢您的时间。

如果不覆盖主干网.Model.set(…),就不能了。我从来都不需要这个功能。。。“只有在事件发生变化时才触发事件”的设计鼓励了事件传播的最佳实践。但您可以只提供一个方法,该方法会自动删除该值,然后立即重新设置该值

编辑:Per
mu太短
下面的注释,您还需要处理
setloudy
被赋予属性散列的可能性。因此,需要清楚地处理单个属性和散列的
方法:

var MyModel = Backbone.Model.extend({
    setLoudly: function(attr, value, options) {
        this.unset(attr, { silent: true });
        return Backbone.Model.prototype.set.call(this, attr, value, options);
    },

    clearSilently: function(attr) {
        if (_.isString(attr)) {
            this.unset(attr, { silent: true });
        } else {
            _.each(_.keys(attr), function(key) {
                this.unset(key, { silent: true });
            }, this);
        }
    }
});

var myModel = new MyModel({
   foo: "bar",
   baz: 4
});

myModel.set('foo', 'bar');  // <<=== No Event
myModel.setLoudly('foo', 'bar');  // <<=== One 'change change:foo' event
myModel.set({
    foo: "bar",
    baz: 4
});  // <<=== No Events
myModel.setLoudly({
    foo: "bar",
    baz: 4
});   // <<=== Will receive 'change change:foo change:baz'
var MyModel=Backbone.Model.extend({
设置:函数(属性、值、选项){
this.unset(attr,{silent:true});
返回Backbone.Model.prototype.set.call(this、attr、value、options);
},
清晰:函数(属性){
if(u.isString(attr)){
this.unset(attr,{silent:true});
}否则{
_.每个(u.keys(attr)、函数(key){
this.unset(键,{silent:true});
},这个);
}
}
});
var myModel=新的myModel({
福:“酒吧”,
巴兹:4
});

myModel.set('foo','bar');// 如果不重写主干.Model.set(…)
,则不能执行此操作。我从来都不需要这个功能。。。“只有在事件发生变化时才触发事件”的设计鼓励了事件传播的最佳实践。但您可以只提供一个方法,该方法会自动删除该值,然后立即重新设置该值

编辑:Per
mu太短
下面的注释,您还需要处理
setloudy
被赋予属性散列的可能性。因此,需要清楚地处理单个属性和散列的
方法:

var MyModel = Backbone.Model.extend({
    setLoudly: function(attr, value, options) {
        this.unset(attr, { silent: true });
        return Backbone.Model.prototype.set.call(this, attr, value, options);
    },

    clearSilently: function(attr) {
        if (_.isString(attr)) {
            this.unset(attr, { silent: true });
        } else {
            _.each(_.keys(attr), function(key) {
                this.unset(key, { silent: true });
            }, this);
        }
    }
});

var myModel = new MyModel({
   foo: "bar",
   baz: 4
});

myModel.set('foo', 'bar');  // <<=== No Event
myModel.setLoudly('foo', 'bar');  // <<=== One 'change change:foo' event
myModel.set({
    foo: "bar",
    baz: 4
});  // <<=== No Events
myModel.setLoudly({
    foo: "bar",
    baz: 4
});   // <<=== Will receive 'change change:foo change:baz'
var MyModel=Backbone.Model.extend({
设置:函数(属性、值、选项){
this.unset(attr,{silent:true});
返回Backbone.Model.prototype.set.call(this、attr、value、options);
},
清晰:函数(属性){
if(u.isString(attr)){
this.unset(attr,{silent:true});
}否则{
_.每个(u.keys(attr)、函数(key){
this.unset(键,{silent:true});
},这个);
}
}
});
var myModel=新的myModel({
福:“酒吧”,
巴兹:4
});

myModel.set('foo','bar');// 在模型上设置属性时,主干将基本上检查新属性是否与当前属性不同,然后触发更改事件。没有替代此行为的选项。您可以尝试以下操作之一:

  • 更改主干源以覆盖此行为-删除检查。(不推荐)
  • 像Peter Wagner建议的那样重写主干.Model.set(…)
  • 手动触发
    更改
    事件:

    model.set('attribute', 2, {silent:true}); //Pass silent to prevent 2 change events if the attribute actually changed.
    model.trigger('change');
    

  • 在模型上设置属性时,主干将基本上检查新属性是否与当前属性不同,然后触发更改事件。没有替代此行为的选项。您可以尝试以下操作之一:

  • 更改主干源以覆盖此行为-删除检查。(不推荐)
  • 像Peter Wagner建议的那样重写主干.Model.set(…)
  • 手动触发
    更改
    事件:

    model.set('attribute', 2, {silent:true}); //Pass silent to prevent 2 change events if the attribute actually changed.
    model.trigger('change');
    

  • 非常正确。扩展解决方案以解决问题。非常正确。扩展解决方案以解决此问题。