2010-11-16 70 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應該是)。業務邏輯應該在模型本身上,而決策邏輯應該在狀態圖中。