2011-12-20 40 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) 
    } 
} 

,並在你的第三個(和其他型號),你可以放棄此檢查。

最後的選擇當然是看你的設計。如果這兩個模型如此密切相關以致它們必須保持彼此同步,那麼合併它們的功能也許是有意義的。或者,您可以將常用功能分開。這完全取決於你的特定情況。