2010-11-16 2 views
2

Я разрабатываю приложение, которое включает иерархию типов и начинается с определения моделей для каждого типа через наследование. Когда дело доходит до написания соответствующих контроллеров, я не уверен, как подойти ко всему этому чистым способом. Должен ли я писать только один контроллер для базового типа, который способен обрабатывать производные модели или должен быть один контроллер для каждого подтипа? Как настроить привязки view-controller для работы с разными контроллерами?Как реализовать полиморфизм в sproutcore?

ответ

0

Ниже приведена информация об определении подклассов и переопределяющих свойств и методов: http://wiki.sproutcore.com/w/page/12412971/Runtime-Objects.

Из моего (ограниченного) использования Sproutcore я смог привязать только один вид к 1 контроллеру.

Таким образом, если вы планируете использовать один вид (например, ListView) для отображения своих данных, то я думаю, что вы сможете привязать это представление только к 1 контроллеру. Это означает, что 1 базовый тип, способный обрабатывать производные модели, кажется, является способом выхода.

+0

Привет, спасибо за ваш ответ. Я попробую так. Все еще интересно, возможно ли это сделать по-другому. Кстати, я перехожу к вашему переупорядочиванию списка. Кажется, это очень полезно. Благодарю. – Dominik

0

Обычно вы заполняете содержимое экземпляров ArrayController результатами вызовов App.store.find. SC.Store # находка может взять экземпляр SC.Query, который обычно выглядит как:

MyApp.myController.set('content') = MyApp.store.find(SC.Query.local(MyApp.MyModel)); 

Это должно возвращать все экземпляры MyApp.MyModel, включая любые экземпляры подклассов MyApp.MyModel в.

Первый аргумент SC.Query.local может быть либо подклассом SC.Record, либо строкой, относящейся к подклассу. Поэтому, если у вас есть промежуточные подклассы SC.Record, вы можете попробовать использовать их там.

0

Контроллеры должны быть просто прокси для объектов, при работе с одиночными экземплярами модели. Другими словами, ObjectController может проксировать что угодно. Вот что я имею в виду в коде:

У вас есть два объекта: Person and Student.

App.Person = SC.Object.extend({ 
    // person stuff here 
}) 

App.Student = App.Person.extend({ 
    // student stuff here, you have have all Person things because you are extending person. 
}) 

Затем вы хотите определить контроллеры:

App.personController = SC.ObjectController.create({ 
    contentBinding: 'App.path.to.person' 
}) 

App.studentController = SC.ObjectController.create({ 
    contentBinding: 'App.path.to.student' 
}) 

обратите внимание, что вы бы только связать содержимое контроллера к чему-то, если человек/студент является результатом выбора, или какой-то другой поток, где переплеты Огонь. Другими словами, если установить лицо вручную (скажем, из диаграммы состояний, в результате взаимодействия), вы бы еще определить контроллер, но будет делать

App.personController.set('content', person); 

Вы создали контроллер по-разному в зависимости от того, Человек является объектом «верхнего уровня» в вашем приложении или некоторым промежуточным объектом, который выбирается. Кроме того, вам может понадобиться только один контроллер, у вас будет только студентController и personController, если вы будете действовать одновременно с человеком и учеником. Оба являются объектами ObjectControllers, и они могут проксировать что угодно.

Наконец, по вашему мнению, вы бы связать соответствующий элемент представления к контроллеру:

...

nameView: SC.LabelView.design({ 
     layout: {/* props */}, 
     valueBinding: SC.Binding.oneWay('App.personController.name') 
    }) 

...

отмечает, что односторонний привязку, если имя не будет изменено на представлении, если вид можно изменить имя, а затем просто сделать нормальное связывание. Также обратите внимание на путь здесь. Я не связываясь с

'App.personController.content.name' 

Поскольку personController предоставляет интерфейс объекта, вы связываете с

'namespace.controller.property-on-object-controller-proxies' 

Если вы ставите много бизнес-логики в контроллере, вы делаете это неправильно. Контроллеры должны быть просто для проксирования объектов (по крайней мере, ObjectControllers должны быть). Бизнес-логика должна быть на самих моделях, а логика принятия решений должна быть в государственных диаграммах.

Смежные вопросы