Javascript 嵌套主干(木偶)模型/集合中的冒泡事件
我们有一个大型木偶应用程序,它使用Javascript 嵌套主干(木偶)模型/集合中的冒泡事件,javascript,backbone.js,marionette,backbone-events,backbone.js-collections,Javascript,Backbone.js,Marionette,Backbone Events,Backbone.js Collections,我们有一个大型木偶应用程序,它使用主干网.trackit来监控模型中未保存的更改 我们现在有一些嵌套模型,事实上我们有一个模型,有一个模型集合,它包含一个模型集合 trackit不支持在子模型更改时将顶级模型标记为“脏”模型-因为主干网没有冒泡这些更改事件 我知道我们可以手动监视这些更改事件,但我正在寻找通用解决方案 是否有人有过以下LIB或任何其他解决方案的经验 当前的需求是让trackit处理嵌套事件-但我找不到任何添加此功能的trackit分支 所以我想知道是否有人尝试过这一点,或者
主干网.trackit
来监控模型中未保存的更改
我们现在有一些嵌套模型,事实上我们有一个模型,有一个模型集合,它包含一个模型集合
trackit
不支持在子模型更改时将顶级模型标记为“脏”模型-因为主干网没有冒泡这些更改事件
我知道我们可以手动监视这些更改事件,但我正在寻找通用解决方案
是否有人有过以下LIB或任何其他解决方案的经验
当前的需求是让trackit
处理嵌套事件-但我找不到任何添加此功能的trackit
分支
所以我想知道是否有人尝试过这一点,或者将上述libs与trackit
结合使用
理想情况下,如果一个库会在整个链中触发一个标准的“更改”事件,那么trackit
就会开始处理这个问题
因此,如果
model.countries[3].region[4].name发生更改,则change:countries
事件将在model
上触发。因此,如果模型启用了trackit
enbaled,它就可以正常工作了 默认情况下,集合中的模型中的事件已经冒泡到集合中。这是解决的一件事,我们只需要从一个集合或模型中的另一个模型中冒泡事件
我看到层次结构上冒泡事件的一个问题是,当您想要收听特定的集合或模型时,会出现误报
避免这种情况的一种方法是出现冒泡的命名空间事件,但这可能不适用于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');
集合
中的任何事件都将以其可选的键
或默认的嵌套
字符串作为前缀。集合触发的更改:myAttribute
事件将是:
"optional-key:change:myAttribute"
概念验证通过简单测试:
//简单的实现
var BubblingModel=Backbone.Model.extend({
/**
*弹出由“对象”触发的任何事件。
*@param{Backbone.Events}obj实现主干事件。
*@param{String}键可选命名空间名称,默认为“嵌套”。
*/
addNested:函数(对象,键){
返回this.listenTo(obj'all',function(){
参数[0]=(键| |“嵌套”)+:“+参数[0];
this.trigger.apply(this,arguments);
});
},
重新召集:功能(obj){
返回此。停止侦听(obj);
}
});
//设置具有多个嵌套的测试
var model5=新主干.Model(),
model4=新主干网。Model(),
model3=新的冒泡模型({model:model4}),
col2=新主干.Collection([model3]),
model2=新的冒泡模型({col:col2}),
col1=新主干.Collection([model2]),
model1=新的冒泡模型({col:col1});
//设置你想要的气泡。
model3.addNested(model4,“model3嵌套模型”);
model2.addNested(col2,“model2嵌套列”)
.addNested(model5);
model1.addNested(col1,“model1嵌套列”);
//从任何一个模型听下去
主干.listenTo(model2,'all',函数(eventName){
log(“model2:,eventName”);
});
Backbone.listenTo(model1,'all',函数(eventName){
log(“model1:,eventName”);
});
//触发默认或自定义事件
模型3.集合(“测试”,1);
模型3.触发器(“模型3”);
模型4.触发器(“模型4”);
模型5.触发器(“模型5”)代码>
默认情况下,集合内模型中的事件已经冒泡到集合中。这是解决的一件事,我们只需要从一个集合或模型中的另一个模型中冒泡事件
我看到层次结构上冒泡事件的一个问题是,当您想要收听特定的集合或模型时,会出现误报
避免这种情况的一种方法是出现冒泡的命名空间事件,但这可能不适用于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');
集合
中的任何事件都将以其可选的键
或默认的嵌套
字符串作为前缀。集合触发的更改:myAttribute
事件将是:
"optional-key:change:myAttribute"
概念验证通过简单测试:
//简单的实现
var BubblingModel=Backbone.Model.extend({
/**
*弹出由“对象”触发的任何事件。
*@param{Backbone.Events}obj实现主干事件。
*@param{String}键可选命名空间名称,默认为“嵌套”。
*/
addNested:函数(对象,键){
返回this.listenTo(obj'all',function(){
参数[0]=(键| |“嵌套”)+:“+参数[0];
this.trigger.apply(this,arguments);
});
},
重新召集:功能(obj){
返回此。停止侦听(obj);
}
});
//设置具有多个嵌套的测试
var model5=新主干.Model(),
model4=新主干网。Model(),
model3=新的冒泡模型({model:model4}),
col2=新主干.Collection([model3]),
model2=新的冒泡模型({col:col2}),
col1=新主干.Collection([model2]),
model1=新的冒泡模型({col:col1});
//设置你想要的气泡。
model3.addNested(model4,“model3嵌套模型”);
model2.addNested(col2,“model2嵌套列”)
.addNested(model5);
model1.addNested