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_Marionette_Backbone Events_Backbone.js Collections - Fatal编程技术网

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