Я разрабатываю приложение, которое включает иерархию типов и начинается с определения моделей для каждого типа через наследование. Когда дело доходит до написания соответствующих контроллеров, я не уверен, как подойти ко всему этому чистым способом. Должен ли я писать только один контроллер для базового типа, который способен обрабатывать производные модели или должен быть один контроллер для каждого подтипа? Как настроить привязки view-controller для работы с разными контроллерами?Как реализовать полиморфизм в sproutcore?
ответ
Ниже приведена информация об определении подклассов и переопределяющих свойств и методов: http://wiki.sproutcore.com/w/page/12412971/Runtime-Objects.
Из моего (ограниченного) использования Sproutcore я смог привязать только один вид к 1 контроллеру.
Таким образом, если вы планируете использовать один вид (например, ListView) для отображения своих данных, то я думаю, что вы сможете привязать это представление только к 1 контроллеру. Это означает, что 1 базовый тип, способный обрабатывать производные модели, кажется, является способом выхода.
Обычно вы заполняете содержимое экземпляров 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, вы можете попробовать использовать их там.
Вы можете проверить SproutCore в новую экспериментальную поддержку полиморфизма: http://groups.google.com/group/sproutcore-dev/browse_thread/thread/b63483ab66333d15
Контроллеры должны быть просто прокси для объектов, при работе с одиночными экземплярами модели. Другими словами, 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 должны быть). Бизнес-логика должна быть на самих моделях, а логика принятия решений должна быть в государственных диаграммах.
- 1. Как реализовать полиморфизм в Scala
- 2. , глядя, как реализовать простой полиморфизм
- 3. Как реализовать полиморфизм функций/процессов в Elixir
- 4. Как реализовать полиморфизм во вложенном классе?
- 5. Как реализовать полиморфизм с помощью std :: shared_ptr?
- 6. Можем ли мы реализовать полиморфизм в структуре?
- 7. sproutcore backend
- 8. Как реализовать общий полиморфизм в C# - часть 2?
- 9. Меню Sproutcore
- 10. Кодировка Base64 в Sproutcore
- 11. SVG в Sproutcore, доступ к DOM-узлам со Sproutcore, привязка sproutcore-событий к DOM
- 12. sproutcore & rails: где приложение sproutcore работает в структуре каталогов рельсов?
- 13. Как добавить iframe в представление в sproutcore?
- 14. Помощь с простой задачей Sproutcore
- 15. Лучший способ реализовать ad-hoc-полиморфизм в Haskell?
- 16. Как установить размер текста LabelView в SproutCore
- 17. Как предварительно загрузить элементы в ListView SproutCore?
- 18. Полиморфизм в объекте-c
- 19. Статический полиморфизм в Delphi
- 20. Sproutcore и данные JSON
- 21. интеграции SproutCore с рельсами
- 22. Как использовать полиморфизм в интерфейсах?
- 23. sproutcore orderBy другой контроллер
- 24. ASP.NET MVC и SproutCore
- 25. Можем ли мы реализовать полиморфизм с использованием интерфейса в C#?
- 26. возможно реализовать динамический полиморфизм с использованием интерфейса в C# .net
- 27. qooxdoo vs sproutcore?
- 28. SproutCore: альтернативы SC.TableView
- 29. Malformed buttons with SproutCore
- 30. Sproutcore + PhoneGap/Titanium?
Привет, спасибо за ваш ответ. Я попробую так. Все еще интересно, возможно ли это сделать по-другому. Кстати, я перехожу к вашему переупорядочиванию списка. Кажется, это очень полезно. Благодарю. – Dominik