【问题标题】:How to organize EmberJS nested resources?如何组织 EmberJS 嵌套资源?
【发布时间】:2013-06-25 19:22:59
【问题描述】:

我正在尝试创建一个小型 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());
  }
});

你怎么看?我做错了吗?

【问题讨论】:

    标签: resources ember.js routes


    【解决方案1】:

    到目前为止,IMO 看起来不错。您正在使用 needs API,这是设置控制器之间依赖关系的正确(ember)方法。

    也许如果您发现自己在编写重复代码,您可以考虑为更通用的控制器创建一个 Mixin,并将您的逻辑放在那里,这应该与它处理的用例无关。

    例如定义一个mixin:

    App.ControllerMixin = Ember.Mixin.create({
      // "use case" agnostic logic here
    });
    

    您可以通过将 mixin 作为第一个参数传递给 .extend 来将 mixin 混合到类中。

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

    希望对你有帮助。

    【讨论】:

    • 谢谢,没有考虑过 mixin 方法,这是我需要多读的东西。我对第一种方法的主要担忧是依赖于子控制器,这对我来说听起来很奇怪。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-03-02
    • 1970-01-01
    • 2015-10-23
    • 2013-06-25
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多