我正在开发一个涉及类型层次结构的应用程序,并通过继承来定义每种类型的模型。当谈到编写相应的控制器时,我不确定如何以一种干净的方式来处理整个事情。我应该只为基础类型编写一个能够处理派生模型的控制器,还是每个子类型应该有一个控制器?应如何设置视图 - 控制器绑定以使用不同的控制器?如何在sproutcore中实现多态?
回答
下面是关于定义子类和重写属性和方法的一些信息: http://wiki.sproutcore.com/w/page/12412971/Runtime-Objects。
从我的(有限)使用Sproutcore,我只能绑定1视图到1控制器。因此,如果您打算使用单个视图(例如ListView)来显示数据,那么我认为您只能将该视图绑定到1个控制器。这意味着能够处理衍生模型的1个基本类型似乎是要走的路。
通常,您可以使用App.store.find调用的结果填充ArrayController实例的内容。 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可以代理任何东西。这里是我的意思代码:
你有两个对象,人和学生。
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')
})
...
注意,单向绑定,如果该名称不会对视图进行更改,如果视图可以更改名称,然后只是做一个正常的绑定。还要注意这里的路径。由于personController代理对象我不结合
'App.personController.content.name'
,绑定到
'namespace.controller.property-on-object-controller-proxies'
如果你把大量的业务逻辑在你的控制器,你做错了。控制器应该只是用于代理对象(至少ObjectControllers应该是)。业务逻辑应该在模型本身上,而决策逻辑应该在状态图中。
- 1. 如何在C#中实现多态#
- 2. 如何在现有数据库中实现多态关联
- 3. Java如何实现接口多态性?
- 4. 如何实现多态CURRENT_USER很好
- 5. 如何实现在动态布局中实现添加更多视图android
- 6. 在MVC中实现多状态模型
- 7. 如何在kinect中实现波姿态?
- 8. 如何在Erlang中实现状态?
- 9. 如何在VBA中实现动态VLOOKUP?
- 10. 在Javascript中实现多态 - 这看起来如何?
- 11. 如何在c#中实现泛型多态?
- 12. 如何在C#中实现某种程度的多态性?
- 13. 如何在spring启动属性文件中实现多态?
- 14. 如何在多态C++中实现此类?
- 15. 我如何在Scala中实现多态性
- 16. 如何在多个数据库表中实现动态搜索
- 17. 如何使用虚函数在C++中实现多态行为?
- 18. 如何在嵌套类中实现多态?
- 19. 如何在c#中实现泛型多态 - 第2部分?
- 20. 如何在实现接口的类中实现静态方法?
- 21. 如何在ewam中实现多线程?
- 22. 如何在wpf中实现多线程
- 23. 在Java中实现多核 - 如何?
- 24. 如何在primefaces datalist中实现多选?
- 25. 如何在C#中实现多继承?
- 26. Sproutcore - rails - 多对多 - json
- 27. 实现多态的想法
- 28. OCaml的让多态实现
- 29. 多态实现问题
- 30. 如何动态实现ionRangeSliders
嗨,谢谢你的回答。我会尝试这种方式。仍然想知道是否有可能以不同的方式做到这一点。顺便说一句,我正在通过你的清单重新排序教程。这似乎很有帮助。谢谢。 – Dominik 2010-11-24 21:41:08