在嵌套的骨干(木偶)模型/集合中冒泡事件
Bubbling events in nested Backbone (Marionette) Models / Collections
我们有一个大型的木偶应用程序,它使用Backbone.trackit
来监控我们模型中未保存的更改。
我们现在有一些嵌套模型,实际上我们有一个模型,一个模型集合,包含一个模型集合。
trackit
不支持在子模型发生变化时将顶级模型标记为"脏"——由于主干不冒泡这些变化事件。
我知道我们可以手动监控这些变化事件,但我正在寻找一个通用的解决方案。
有没有人有以下库或任何其他解决方案的经验?
- backbone-deep-model
- 骨干协会事件
- 自定义Backbone.Model.set覆盖气泡改变事件
直接的要求是让trackit
工作与嵌套的事件-但我找不到任何分支trackit
添加这个。
所以我想知道是否有人已经接近了这一点,或者将上述库与trackit
结合使用?
理想情况下,如果一个库会触发一个标准的'更改'事件,然后trackit
会选择这个并开始工作。
所以,如果model.countries[3].regions[4].name
改变了,change:countries
事件将在model
上触发。因此,如果模型启用了trackit
,它就会正常工作!
集合内模型的事件在默认情况下已经冒泡到集合中。所以这是一个问题,我们只需要从一个集合或另一个模型中的一个模型冒泡事件。
我看到冒泡事件的一个问题是向上的层次结构是,当你想听特定集合或模型时,你会得到假阳性。
避免这种情况的一种方法是命名冒泡的事件,但这可能不适用于trackit。一个模型的简单实现,允许冒泡任意集合或其他嵌套模型的事件:
var BubblingModel = Backbone.Model.extend({
/**
* Bubbles up any event triggered by 'object'.
* @param {Backbone.Events} obj which implement the Backbone Events.
* @param {String} key optional namespace name, default to 'nested'.
*/
addNested: function(obj, key) {
return this.listenTo(obj, 'all', function() {
arguments[0] = (key || 'nested') + ':' + arguments[0];
this.trigger.apply(this, arguments);
});
},
removeNested: function(obj) {
return this.stopListening(obj);
}
});
和使用它:
var collection = new Backbone.Collection(),
model = new BubblingModel();
model.addNested(collection, 'optional-key');
collection
中的任何事件都将以其可选的key
或默认的nested
字符串作为前缀。collection
触发的change:myAttribute
事件为:
"optional-key:change:myAttribute"
概念验证与简单测试:
// The simple implementation
var BubblingModel = Backbone.Model.extend({
/**
* Bubbles up any event triggered by 'object'.
* @param {Backbone.Events} obj which implement the Backbone Events.
* @param {String} key optional namespace name, default to 'nested'.
*/
addNested: function(obj, key) {
return this.listenTo(obj, 'all', function() {
arguments[0] = (key || 'nested') + ':' + arguments[0];
this.trigger.apply(this, arguments);
});
},
removeNested: function(obj) {
return this.stopListening(obj);
}
});
// Setting up a test with multiple nesting
var model5 = new Backbone.Model(),
model4 = new Backbone.Model(),
model3 = new BubblingModel({ model: model4 }),
col2 = new Backbone.Collection([model3]),
model2 = new BubblingModel({ col: col2 }),
col1 = new Backbone.Collection([model2]),
model1 = new BubblingModel({ col: col1 });
// Set which you want to bubble up.
model3.addNested(model4, 'model3-nested-model');
model2.addNested(col2, 'model2-nested-col')
.addNested(model5);
model1.addNested(col1, 'model1-nested-col');
// listen from any model down the chain
Backbone.listenTo(model2, 'all', function(eventName) {
console.log("model2:", eventName);
});
Backbone.listenTo(model1, 'all', function(eventName) {
console.log("model1:", eventName);
});
// trigger default or custom events
model3.set('test', 1);
model3.trigger('model3');
model4.trigger('model4');
model5.trigger('model5');
<script src="https://cdnjs.cloudflare.com/ajax/libs/jquery/3.1.1/jquery.min.js"></script>
<script src="https://cdnjs.cloudflare.com/ajax/libs/underscore.js/1.8.3/underscore-min.js"></script>
<script src="https://cdnjs.cloudflare.com/ajax/libs/backbone.js/1.3.3/backbone-min.js"></script>
相关文章:
- 骨干-为什么不;t集合.重置触发模型事件
- 如何断开主干集合,使每个子集合也注册到将由父集合注册的所有事件
- 将事件处理程序分配给元素集合
- 如何在集合中的项上触发 jQuery 事件(意外的 jQuery 结果来自 $._data() 与集合的第一个元素)
- 在集合的空结果集上触发“重置”主干事件
- 复合视图在扩展主干集合时未收到“删除”事件
- 主干分组依据集合仅在一次事件单击后呈现
- 主干.js:在集合中使用时不会触发模型事件
- 主干集合未触发添加事件
- 使用模板事件侦听器删除 Meteor.js 集合时出现问题
- 为什么我的主干集合重置事件没有触发
- 主干在模型被“设置”到集合中后触发事件
- 所有集合项的 Backbonejs 事件或每个项视图的事件
- 在Backbone.js集合上引发自定义事件并传递数据
- 启动主干集合更改事件,但视图中没有任何更改
- 通过更改事件调用方法时,主干集合为空
- Backbone.js-can't获取数据,或绑定到集合上的获取事件
- 模型上的主干集合更改事件
- 分离“骨干”集合(事件问题)
- 在集合事件中为主干语法而挣扎