1

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

你怎么看?我做错了吗?

4

1 回答 1

1

到目前为止,IMO 看起来不错。您正在使用needsAPI,这是设置控制器之间依赖关系的正确(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
});

另一种可能性是编写一个超类,然后从它扩展以继承通用逻辑:

摘自文档的片段:

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

希望能帮助到你。

于 2013-06-25T20:22:56.110 回答