使Backbone.js模型更改"部分"无声?

时间:2011-12-20 20:37:21

标签: javascript backbone.js

当我的“chartModel”发生变化时,我想更新“globalModel”。

chartModel.bind("change", updateGlobalModel);

updateGlobalModel(){
  globalModel.set(obj)
}

反之亦然,我希望我的chartModel在globalModel更改时更新。

globalModel.bind("change", updateChartModel);

updateChartModel(){
  chartModel.set(obj)
}

这会在设置globalModel时产生反馈循环。我可以通过设置{silent:true}来阻止这种情况。

但问题出现了。我有另一个依赖于变更事件的模型:

globalModel.bind("change", updateOtherModel);

如何提醒此模型的变更但不提醒前者(以避免反馈循环)?

更新
现在,我决定为每个集合调用生成一个特定的ID:

set : function(attrs, options) { 
        if(!("setID" in attrs)){
            attrs.setID = myApp.utils.uniqueID(); //newDate.getTime();
        }
        Backbone.Model.prototype.set.call(this, attrs, options);
    },

这样,我总是可以在应用程序的任何位置生成“setID”属性。如果从模型中提取东西时setID仍然相同,我知道可能存在反馈循环的风险。

2 个答案:

答案 0 :(得分:1)

迟到总比没好..

最简单的方法是使用标志。例如,在globalModel中设置内容时,您还可以更改模型上的属性以指示您已更改某些内容。然后,您可以在updateChartModel中验证此标志的值。例如:

chartModel.bind(“change”,updateGlobalModel);

function updateGlobalModel() {
    if (!flag) {
        globalModel.set(obj);
        flag = true;
    }
}

可能非常类似于您最终使用setID所做的事情。另外,下划线内置了uniqueId函数。

你可以做的另一件事,就是更清洁,就是通过你的套装电话传递一个选项。

chartModel.set(obj, { notify : false });

是的,你可以传递你想要的任何选项,你不仅限于{ silent : true }。有关详情,请参阅this discussion on github。然后,检查是否存在此属性,您可以在其中处理更改事件,如下所示:

function updateGlobalModel(model, options){
    // explicitly check for false since it will otherwise be undefined and falsy
    // you could reverse it.. but I find this simpler
    if (options.notify !== false) {
        globalModel.set(obj)
    }
}

并且在您的第三个(和其他型号)中,您可以放弃此检查。

最后的选择当然是看你的设计。如果这两个模型密切相关,必须保持彼此同步,那么合并它们的功能可能是有意义的。或者,您可以拆分常用功能。这完全取决于您的具体情况。

答案 1 :(得分:0)

我的知识是有限的,所以也许我不应该回答,但我会尝试传递对chartModel的引用,当它被创建时引用你想要更新的“其他”模型。然后在updateChartModel()上触发一个事件,并确保你的“其他”模型绑定在该事件上。

我的问题是:静音对象是否将所有事件静音?或只是模型相关的?如果所有事件都被静音,这显然不会起作用。