2012-04-18 40 views
0

在SproutCore的,它是對ListView.content綁定到ArrayController的常用方法:SproutCore的混淆在綁定的ListView內容到ArrayController

Todos.todosController = SC.ArrayController.create({ 
}); 

SC.ListView.design({ 
    contentBinding: SC.Binding.oneWay('Todos.todosController'), 
    exampleView: SC.CheckboxView.design({ 
     .......... 
    }) 
}) 

但是ListView中的哪個從SC.CollectionView延伸「內容」字段是SC.Array,不應該是:

contentBinding: SC.Binding.oneWay('Todos.todosController.content') 

任何解釋將不勝感激。對不起英文不好。

@TopherFangio我看着SC.ArrayController實施和找出.arrangedObjects是返回的對象屬於一個非常簡單的計算屬性:

arrangedObjects: function() { 
    return this; 
}.property().cacheable() 

所以結合實際.arrangeObjects是一樣的結合:App.arrayController.arrangeObjects

我也發現SC.ArrayController擴展SC.Array並實現了兩個所需的方法'replace()'和'objectAt()'。

要在您自己的類中支持SC.Array,您必須重寫兩個使用它的基元:replace()和objectAt()。

SC.ArrayController中執行這兩個方法會執行一些特定於數組控制器的特定檢查並將請求轉發給.content屬性。

所以就像@TopherFangio所說的,SC.ArrayController是它的底層.content屬性的代理。如果我直接綁定到App.arrayController.content而不是控制器本身,我想我會失去所有的arrayController善良。

再次感謝您的大力幫助@TopherFangio。

回答

1

SC.ArrayController實際上是一個代理對象,它爲你做了一些很好的事情。

您當然可以綁定到.content屬性,但您也可以綁定到.arrangedObjects屬性並設置orderBy屬性。這將允許您修改orderBy並使綁定列表自動更新。一般來說,這是你想要做的。

此外,我相信Todos.todosController.length將始終是一個數字,即使內容爲空。相反,如果content爲空,則調用Todos.todosController.content.length將引發錯誤。

希望這有助於:-)

+0

謝謝你的解釋。事實證明,我沒有仔細閱讀文檔。所以實際綁定到Todos.todosController就和綁定到Todos.todosController.arrangedObjects一樣? – merlin 2012-04-19 01:40:50

+0

@merlin我其實不知道;它可以與綁定到'.arrangedObjects'或綁定到'.content'相同。出於某種原因,我認爲這是'.content',但我可能會誤解。 – 2012-04-19 18:54:45

+1

對'Todos.todosController.arrangedObjects'的綁定與對'Todos.todosController'的綁定是一樣的,因爲'arrangeObjects'剛剛返回'this'。但是習慣於綁定''''''''''''''''''''''''''''''''''''''可以在你需要的奇怪場合覆蓋'這也說明了你的意圖。綁定到控制器的「內容」會挫敗使用控制器的目的,因爲它完全繞過控制器。 – geoffreyd 2012-05-16 00:26:20