Как реализовать полиморфизм в ростке? - PullRequest
2 голосов
/ 17 ноября 2010

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

Ответы [ 4 ]

2 голосов
/ 26 апреля 2011

Возможно, вы захотите проверить новую экспериментальную поддержку полиморфизма в SproutCore: http://groups.google.com/group/sproutcore-dev/browse_thread/thread/b63483ab66333d15

0 голосов
/ 12 мая 2011

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

У вас есть два объекта, Person и 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);

Вы настраиваете контроллер по-разному в зависимости отявляется ли Person объектом верхнего уровня в вашем приложении или каким-либо промежуточным объектом, который выбирается.Кроме того, вам может понадобиться только один контроллер, у вас будут только studentController и 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).Бизнес-логика должна быть на самих моделях, а логика принятия решений должна быть в диаграммах состояний.

0 голосов
/ 08 декабря 2010

Обычно содержимое экземпляров ArrayController заполняется результатами вызовов App.store.find. SC.Store # find может принимать экземпляр 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 голосов
/ 21 ноября 2010

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

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

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

...