0

Here's a Fiddle觀察員缺少更新?

該模板包含具有不同綁定屬性的相同子視圖的多個實例。你可以看到這些綁定屬性何時觸發觀察者的事件。請注意,子視圖A和D觸發器,但B和C從不這樣做。

{{view App.SubView identifier="A" modelDataBinding="view.person.first"}} 
{{view App.SubView identifier="B" modelDataBinding="view.person.children"}} 
{{view App.SubView identifier="C" modelDataBinding="[email protected]"}} 
{{view App.SubView identifier="D" modelDataBinding="view.person.children.length"}} 

所以,2部分的問題:

  1. 爲什麼不B或C曾經火?
  2. 什麼是綁定到這個Person模型的孩子的正確方法?

回答

1

你在這裏混合了兩件事:綁定與觀察者不一樣。你不能綁定到@ @ each.name,你需要綁定到數組並觀察@each。綁定是2個值之間的連接,@each並不是一個真正的值,它是一種特殊的語法,用於告訴觀察者(或計算出的屬性依賴關係),您希望依賴於集合中每個元素的屬性。

另一個問題是,如果在設置值後添加觀察者,它將不會觸發,因爲該值已設置(即沒有更改)。在你的例子中,App.Person.find(1)立即返回對象,person.children也是這樣 - 它立即返回數組,它將在稍後填充數據。所以在你運行addObserver的時候,孩子已經被設置了,只有它的內容會被改變(這就是爲什麼長度觀察者會正確地觸發)。

下面是一些變化的小提琴:http://jsfiddle.net/drogus/6EVty/1/(我加observerPath和視圖插入後置人),代碼:

<script type="text/x-handlebars" data-template-name="main"> 
    {{view App.SubView identifier="A" modelDataBinding="view.person.first"}} 
    {{view App.SubView identifier="B" modelDataBinding="view.person.children"}} 
    {{view App.SubView identifier="C" modelDataBinding="view.person.children" observePath="[email protected]"}} 
    {{view App.SubView identifier="D" modelDataBinding="view.person.children.length"}} 
</script> 

和視圖類:

SubView: Ember.View.extend({ 
    init: function() { 
     this._super(); 
     var observePath = this.get('observePath') || 'modelData'; 
     this.addObserver(observePath, this, function() { 
      document.write('trigger ' + this.get('identifier') + ': ', this.get('modelData'), '<br />'); 
     }); 
    } 
}) 
+0

很好的解釋, 謝謝! – KOGI 2013-07-07 22:58:22