在 SproutCore 中,将 ListView.content 绑定到 ArrayController 是一种常见的方法:
Todos.todosController = SC.ArrayController.create({
});
SC.ListView.design({
contentBinding: SC.Binding.oneWay('Todos.todosController'),
exampleView: SC.CheckboxView.design({
..........
})
})
但是从 SC.CollectionView 扩展的 ListView 的“内容”字段是 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。