2012-04-18 5 views
0

В SproutCore, это распространенный способ связать ListView.content к ArrayController:SproutCore Смешение в Binding 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 всегда будет числом, даже если содержание равно null. В противоположность этому, вызов Todos.todosController.content.length вызовет ошибку, если content был равен нулю.

Надеюсь, что это поможет :-)

+0

Благодарим вас за отличное объяснение. Оказывается, я не внимательно прочитал документ. Так на самом деле привязка к Todos.todosController такая же, как привязка к Todos.todosController.arrangedObjects? – merlin

+0

@merlin Я на самом деле понятия не имею; это либо то же самое, что привязка к '.arrangedObjects', либо привязка к' .content'. По какой-то причине я думаю, что это '.content', но я мог ошибаться. –

+1

Да, привязка к 'Todos.todosController.arrangedObjects' такая же, как привязка к' Todos.todosController', поскольку 'organizObjects' просто возвращает' this'. Но привычка привязываться к 'assemblyObjects' позволяет вам переписать свойство' builtObjects' в нечетных случаях, в которых вы нуждаетесь.Это также очень ясно говорит о ваших намерениях. Привязка к «содержимому» контроллера приведет к поражению цели использования контроллера, поскольку он полностью обходит его. – geoffreyd