2011-12-20 88 views
6

当我的“chartModel”发生变化时,我想更新“globalModel”。让Backbone.js模型变“部分”沉默?

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); 

我怎么能提醒这个变化的模型,但不是前一个(以避免反馈回路)?

UPDATE:
现在,我决定为每一个集合呼叫特定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仍然相同,我知道可能存在反馈循环的风险。

回答

0

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

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

+0

感谢您的建议 - 如果我的解决方法失败,我会尝试一下(我更新了我的问题。) – dani

1

比从未更好的迟到。

最简单的方法是使用标志。例如,当在​​中设置某些内容时,还可以更改模型上的属性以表明您已更改了某些内容。然后您可以在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) 
    } 
} 

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

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