2010-11-16 23 views
2

我正在开发一个涉及类型层次结构的应用程序,并通过继承来定义每种类型的模型。当谈到编写相应的控制器时,我不确定如何以一种干净的方式来处理整个事情。我应该只为基础类型编写一个能够处理派生模型的控制器,还是每个子类型应该有一个控制器?应如何设置视图 - 控制器绑定以使用不同的控制器?如何在sproutcore中实现多态?

回答

0

下面是关于定义子类和重写属性和方法的一些信息: http://wiki.sproutcore.com/w/page/12412971/Runtime-Objects

从我的(有限)使用Sproutcore,我只能绑定1视图到1控制器。因此,如果您打算使用单个视图(例如ListView)来显示数据,那么我认为您只能将该视图绑定到1个控制器。这意味着能够处理衍生模型的1个基本类型似乎是要走的路。

+0

嗨,谢谢你的回答。我会尝试这种方式。仍然想知道是否有可能以不同的方式做到这一点。顺便说一句,我正在通过你的清单重新排序教程。这似乎很有帮助。谢谢。 – Dominik 2010-11-24 21:41:08

0

通常,您可以使用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子类,你可能想尝试在那里使用它们。

0

控制器应该仅仅是对象的代理,与您的模型的单个实例的时候。换句话说,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应该是)。业务逻辑应该在模型本身上,而决策逻辑应该在状态图中。