【问题标题】:Ember.js: Using an ArrayController without a route?Ember.js:使用没有路由的 ArrayController?
【发布时间】:2014-04-21 19:30:30
【问题描述】:

我有一个想要在页面上显示的类别列表。我一直在寻找正确的方法来执行此操作几个小时,但我一直在发现相互冲突的信息和方法,这些信息和方法要么不再适用于当前版本的 Ember,要么已被弃用。

创建应用程序和 Ember-Data 事物:

var App = Ember.Application.create();
App.ApplicationAdapter = DS.FixtureAdapter;

App.Store = DS.Store.extend({
  adapter: 'DS.FixtureAdapter'
});

我正在使用 Ember-Data 和一些类别的固定数据:

App.Category.FIXTURES = [{
  id:          1,
  name:        'Category 1',
  description: 'The first category'
}, {
  id:          2,
  name:        'Category 2',
  description: 'The second category'
}];

然后我创建一个模型来表示一个类别的实例(“版本”与版本实例具有类别实例的不同模型相关):

App.Category = DS.Model.extend({
  versions:    DS.hasMany('version'),
  name:        DS.attr('string'),
  description: DS.attr('string')
});

然后我制作了一个 ArrayController,但我无法填充内容。

App.CatagoriesController = Ember.ArrayController.create({
  content: [],
  init: function () {
    this.set('content', ???);
  }
});

因为它不可导航,所以它没有连接到路由,所以我不能在路由中使用“模型”属性。

替换 ArrayController 中的???,我尝试了几件事:

我尝试了this.store.find('category'),就像示例中显示的路由一样,但我收到错误“Uncaught TypeError: Cannot read property 'find' of null”。

我尝试了App.Store.find('category'),结果出现错误“Uncaught TypeError: undefined is not a function”。

感谢您向正确方向提供任何帮助或推动。我有一种感觉,我什至没有朝着正确的方向前进。

【问题讨论】:

    标签: javascript ember.js ember-data


    【解决方案1】:

    几件事。

    首先,请记住控制器是单例的。因此,您的 init 函数只会在应用程序的整个生命周期内触发一次(这可能不是您想要的)。但这并不重要,因为...

    您处理模型的方式与 Ember.js 的设置方式不同。您不应该在控制器中获取模型,而应该只获取路由。这就是控制器上没有store 属性的原因。你需要在你的路由上实现model 钩子,像这样:

    App.CategoriesRoute = Ember.Route.extend({
        model: function() {
            return this.store.find('category');
        }
    });
    

    从那里,Ember 将自动将控制器上的 model 属性(不是content 属性,不要使用它)设置为从 model 返回的数据钩子。

    因此,只需从控制器中删除 content 属性和 init 函数,然后在模型中实现该挂钩,就可以开始了。

    【讨论】:

    • 感谢您的回复。因此,即使它不应该通过 URL 导航,也可以为某些东西设置路由?从我看到的所有示例中,我的印象是 Ember 路由总是直接链接到 URL。
    • 对不起,我忘了在我的回答中问这个问题。当您说它不可导航时,您如何到达显示此数据的页面?
    • 我猜关键是每个页面都应该有一个位置(URL)。即使该位置可能嵌入在另一个页面中。有一些方法可以让控制器没有路由,但它们仍然需要某种位置。
    • 我有名为“版本”的对象,每个对象都属于一个类别。所以我有一条路线“/version/:version_id”,它显示了一个带有该版本信息的 UI,但我想允许用户更改类别。所以我需要获取类别列表以将它们放入选择列表中。由于我的应用程序中可能有多个地方需要这个类别列表,我假设有一种很好的方法可以在 Ember 中编写它以避免代码重用(因此,没有代码来获取版本控制器中的类别) .
    • 您可能希望从使用application template 开始。随着您使用 Ember.js 的次数越来越多,您会看到越来越多的方法可以嵌套您的模板(和路由)以消除代码重复。
    猜你喜欢
    • 1970-01-01
    • 2012-07-04
    • 1970-01-01
    • 2013-03-18
    • 2020-10-07
    • 2013-08-16
    • 2012-05-13
    • 1970-01-01
    • 2012-06-26
    相关资源
    最近更新 更多