我正在尝试创建一个小型EmberJS应用程序,但我正在努力解决如何正确构建它。我有一个名为“库”的主视图,它在侧栏上显示文件夹列表。用户可以单击每个文件夹并在中心显示内容(边栏仍处于活动状态)。
因此,我有一个库资源和嵌套资源,用于显示此特定上下文中的文件夹:
this.resource('library', function() {
this.resource('libraryFolders', {path: 'folders'}, function() {
this.resource('libraryFolder', {path: ':folder_id'};
}
};
为了能够访问父根目录中的文件夹,我设置了一个依赖项:
App.LibraryController = Ember.Controller.extend({
needs: ["libraryFolders"],
folders: null,
foldersBinding: "controllers.libraryFolders"
});
App.LibraryRoute = Ember.Route.extend({
setupController: function(controller) {
controller.set('controllers.libraryFolders.model', App.Folder.find());
}
});
第一个问题:这是一个好方法吗?我觉得父控制器对其子节点具有依赖性有点奇怪。
现在,出现了另一个问题:如果我想在另一个上下文中重用文件夹怎么办?我在LibraryFoldersController中编写的所有方法都是特定于这个,而不是真正的DRY。我想出的是添加一个根“文件夹”资源,并将相关性添加到这个:
this.resources('folders');
App.LibraryController = Ember.Controller.extend({
needs: ["Folders"],
folders: null,
foldersBinding: "controllers.folders"
});
App.LibraryRoute = Ember.Route.extend({
setupController: function(controller) {
controller.set('controllers.folders.model', App.Folder.find());
}
});
你怎么看?我做错了吗?
答案 0 :(得分:1)
IMO到目前为止看起来不错。您正在使用needs
API,这是在控制器之间设置依赖关系的正确(ember)方式。
也许如果你发现自己在编写重复代码,你可以考虑为更通用的控制器创建一个Mixin
,把它放在你的逻辑上,这应该与它处理的用例无关。
例如定义了一个mixin
:
App.ControllerMixin = Ember.Mixin.create({
// "use case" agnostic logic here
});
通过将mixins作为第一个参数传递给.extend
来混合使用。
App.LibraryController = Ember.ObjectController.extend(App.ControllerMixin, {
// now you can use here the logic defined in your mixin
// and add custom code as you please
});
另一种可能性是编写一个超类,然后从它扩展到继承公共逻辑:
摘自docs:
的代码段
App.Person = Ember.Object.extend({
helloWorld: function() {
alert("Hi, my name is " + this.get('name'));
}
});
var tom = App.Person.create({
name: 'Tom Dale'
});
tom.helloWorld(); // alerts "Hi, my name is Tom Dale".
值得一提的是(虽然我认为这只是一个错字):needs: ["Folders"]
应为needs: ["folders"],
希望它有所帮助。