2014-06-23 61 views
1

我有一个基本控制器,我想重新打开,这样我就可以覆盖'needs'参数,但是相反,新参数会添加'needs'参数。重新打开Ember Controller'needs'with Reopen

例如,我原来的控制器看起来是这样的:

App.MessagesController = Ember.ArrayController.extend({ 
    needs: ['blog', 'services', 'post_edit'] 
}); 

我有一个积累的过程,包括在其他应用此控制器文件,并避免代码冗余,我希望能够重新打开控制器并根据需要进行小的更改,包括'needs'参数。像这样:

App.MessagesController.reopen({ 
    needs: ['post', 'services'] 
}); 

问题是,当这段代码运行时,'needs'参数没有被覆盖 - 它被扩展了。它本质上变成:needs: ['blog', 'services', 'post_edit', 'post']

有没有办法覆盖重新打开控制器的'needs'参数?或者也许有更好的方法呢?


编辑为了清楚:

否则在控制器上的查找显示控制台错误,显示“需要”参数不被覆盖。

$: App.__container__.lookup('controller:Messages'); 

Error: <App.MessagesController:ember322> needs [ controller:blog, controller:post_edit ] but they could not be found 

在重新打开时向“需要”参数中添加另一个虚假控制器项目会添加此错误消息。

回答

1

您可能想要将属于应用1的功能提取到mixin中,并将其包含在控制器中。然后在两个应用程序之间共享具有共享功能的基础控制器。

//Included in both apps 
App.BaseMessagesController = Ember.ArrayController.extend({ 
    sharedValue:'foo' 
}); 

//App 1 
App.App1Mixin = Ember.Mixin.create({ 
    needs: ['blog', 'services', 'post_edit'] 
}); 

App.MessagesController = Ember.BaseMessagesController.extend(App.App1Mixin,{ 

}); 
+0

该解决方案效果很好。你碰巧知道为什么重新开始推动'需求'而不是压倒一切? – yonbeastie

+0

是的,内部重新打开只是传递属性,就好像它们是一个mixin一样,并且应用一个mixin合并needs数组(当你有一系列不同需求的mixin时,这非常有用)。 – Kingpin2k