如何组织EmberJS嵌套资源?

时间:2013-06-25 19:22:59

标签: resources ember.js routes

我正在尝试创建一个小型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());
  }
});
你怎么看?我做错了吗?

1 个答案:

答案 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"],

希望它有所帮助。