关于创建和扩展成员控制器的差异;它们的命名约定和范围



现在我对ember控制器的理解遇到了障碍。

我有一个模型"批次",它从来不是路线或控制器的主要模型。我希望能够通过arraycontroller从我的应用程序中的任何路径访问这个类的所有对象。

因此,我创建了一个空批次控制器,它只不过是

// controllers/batches.js
App.BatchesController = Ember.ArrayController.create();

然后我创建了一个包含的批初始化器

// initializers/batches.js
Ember.Application.initializer({
  name: 'batch',
  after: 'preload',
  initialize: function (container, application) {
    var store;
    store = container.lookup('store:main');
    store.find('batch', { state: "uploaded" }).then(function (batches) {
      App.BatchesController.set('content', batches.content);
    });
  }
});

请注意,在经历了一番心痛之后,我发现这种设置只适用于大写B的批量控制器,尽管一位同事读到这实际上应该是小写,我不知道为什么这两件事都很重要。

这个设置基本上可以工作,直到我需要在另一个控制器中引用这个控制器的内容。这是第二个控制器:

// controllers/inbox.js
App.InboxController = App.LibraryController.extend({
  needs: ['application', 'batches'],

  hasActiveBatches: function () {
    // do something here
    this.get('controllers.batches') ==> TypeError: undefined is not a function
  }.property('controllers.batches')
});

相反,我只能通过"App.BatchesController"访问批次控制器的内容这对于创建计算的属性没有任何用处。

我意识到我的控制器有根本的不同,因为它是手动创建的,而不是由ember扩展和实例化的,但我真的不明白区别是什么,也不明白它如何影响我访问它内容的选项。

如果能澄清这里的幕后情况,以及可能在这里使用的更好的模式,我们将不胜感激。

  1. 控制器类应大写。它们不应该被创建,而应该被扩展。当使用需求时,您应该在camelCase中指定它
  2. 当ember创建一个控制器时,它会跟踪它,并通过需要将其提供给其他控制器,如果你创建了它,它并不知道它
  3. 使用初始化器在这里很奇怪,在应用程序控制器中获取批并设置控制器会更有意义

我只想这样做,创建一个数组,并将其连接到所有控制器上。然后你就可以访问控制器上的产权,而不必使用需求或类似的东西(如果你愿意,你也可以在所有路由上注入它)。

Ember.Application.initializer({
  name: 'batch',
  after: 'preload',
  initialize: function (container, application) {
    var store = container.lookup('store:main'),
        batchesArr = [];
    application.register("my:batches", batchesArr, {instantiate: false});
    application.inject("controller", "batches", "my:batches");
    store.find('batch', { state: "uploaded" }).then(function (batches) {
      batchesArr.pushObjects(batches.toArray());
    });
  }
});

示例:http://emberjs.jsbin.com/nobima/8/edit

的示例每个人都有相同的集合,一个更新,他们都更新:http://emberjs.jsbin.com/nobima/9/edit?html,js,输出

使用controllerFor的示例:http://emberjs.jsbin.com/nobima/11/edit

最新更新