Javascript 向对象添加主干事件,不注册;关于;修改时的事件
我可能误解了主干中的事件系统,但是当我尝试下面的代码时,什么也没有发生。当我向主干添加新属性时,它是否应该触发某种更改、更新或重置事件。事件扩展对象?就像模型一样 咖啡脚本: 上面的代码在一个JSBin中 我尝试使用Javascript 向对象添加主干事件,不注册;关于;修改时的事件,javascript,backbone.js,coffeescript,Javascript,Backbone.js,Coffeescript,我可能误解了主干中的事件系统,但是当我尝试下面的代码时,什么也没有发生。当我向主干添加新属性时,它是否应该触发某种更改、更新或重置事件。事件扩展对象?就像模型一样 咖啡脚本: 上面的代码在一个JSBin中 我尝试使用对象。set,或者直接应用它,而不是在子对象中,但现在还没有。有什么想法吗 非常感谢:)您混淆了带有事件的视图/模型/集合中的.get和以及其他功能 例如,主干网将如何触发上的更改事件。set: set: function(attr, value) { this.attribut
对象。set
,或者直接应用它,而不是在子对象中,但现在还没有。有什么想法吗
非常感谢:)您混淆了带有事件的视图/模型/集合中的
.get
和以及其他功能
例如,主干网将如何触发上的更改事件。set
:
set: function(attr, value) {
this.attributes[attr] = value;
this.trigger('change:' attr, ...);
}
代码比这要复杂一点,但它实际上就是这么做的。没有魔法。主干网没有你所期望的“神奇”的对象观察功能,但这很有意义,但超出了回答问题的范围
抱歉,我不知道如何在CoffeeScript中编写,您的jsbin中有两个错误,但下面是一个普通JavaScript的示例:
var ItemModel = function() {
this.items = {}; // It is important this is created in instance-scope.
this.initialize();
};
_.extend(ItemModel.prototype, Backbone.Events, {
initialize: function() {},
set: function(attr, value, options) {
options = options || {};
var oldValue = this.items[attr];
this.items[attr] = value;
if (!options.silent) {
this.trigger('change', attr, value, {
oldValue: oldValue
});
this.trigger('change:' + attr, value, {
oldValue: oldValue
});
}
},
get: function(attr) {
return this.items[attr];
}
});
ItemModel.extend = Backbone.Model.extend;
var MyImplementationOfItem = ItemModel.extend({
initialize: function() {
this.on('change', this.onItemChange);
},
onItemChange: function(attr, value, options) {
alert(attr + ' changed to ' + value + ' from ' + options.oldValue);
}
});
var myImplementationOfItem = new MyImplementationOfItem();
// Wait 4s then trigger it.
setTimeout(function() {
myImplementationOfItem.set('hello', 'world');
}, 2000);
setTimeout(function() {
myImplementationOfItem.set('hello', 'universe');
}, 4000);
小提琴:
请注意,这是对视图/模型/集合中已有的get和set的简化重新实现。我们鼓励您改用它们 谢谢你的回答-我以为它会继承变化事件,但我想不会。如果你不介意我问的话,有什么解决办法?在添加新属性时只需启动obj.trigger()?我是否必须使用set()
?我想如果我手动触发事件,我使用set还是直接修改对象都无关紧要,是吗?是的,你必须通过代理。set
我现在就举个例子,为编辑干杯-我将在周一(现在是啤酒时间!)仔细查看,然后回复/投票/接受。从简单的一瞥中,我不禁想知道是否只是将我需要的数据建模为一组模型。您可以忽略jsbin中的错误;它将其转换为javascript而不是coffeescript!香草js当然不错,我只是喜欢语法糖;)再次感谢@MattFletcher没问题-是的,我建议使用backbone的系列和型号,除非你有很好的理由不这么做。享受啤酒吧!最后,通过使用模型和集合,我让一切都正常工作了。这是一个遗憾,因为仅仅在一个简单的对象上利用事件的力量是很好的,但是这样做还是更好的,因为它使一切都更加健壮。谢谢你的帮助,多米尼克!
var ItemModel = function() {
this.items = {}; // It is important this is created in instance-scope.
this.initialize();
};
_.extend(ItemModel.prototype, Backbone.Events, {
initialize: function() {},
set: function(attr, value, options) {
options = options || {};
var oldValue = this.items[attr];
this.items[attr] = value;
if (!options.silent) {
this.trigger('change', attr, value, {
oldValue: oldValue
});
this.trigger('change:' + attr, value, {
oldValue: oldValue
});
}
},
get: function(attr) {
return this.items[attr];
}
});
ItemModel.extend = Backbone.Model.extend;
var MyImplementationOfItem = ItemModel.extend({
initialize: function() {
this.on('change', this.onItemChange);
},
onItemChange: function(attr, value, options) {
alert(attr + ' changed to ' + value + ' from ' + options.oldValue);
}
});
var myImplementationOfItem = new MyImplementationOfItem();
// Wait 4s then trigger it.
setTimeout(function() {
myImplementationOfItem.set('hello', 'world');
}, 2000);
setTimeout(function() {
myImplementationOfItem.set('hello', 'universe');
}, 4000);