Ember.js:使用没有路由的ArrayController?

时间:2014-04-21 19:30:31

标签: javascript ember.js ember-data

我有一个我想在页面上显示的类别列表。我一直在寻找正确的方法来做几个小时,但我一直在寻找相互矛盾的信息和方法,这些信息和方法要么不再使用当前版本的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:无法读取属性'找到'为null”。

我尝试了App.Store.find('category')并且给了我错误“Uncaught TypeError:undefined不是函数”。

任何帮助或推动正确的方向表示赞赏。我有一种感觉,我甚至没有朝着正确的方向前进。

1 个答案:

答案 0 :(得分:1)

有几件事。

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

您处理模型的方式不是Ember.js的设置方式。您不应该在控制器中获取模型,只能获取路径。这就是控制器上没有store属性的原因。您需要在路线上实施model挂钩,如下所示:

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

从那里开始,Ember会自动将控制器上的model属性( content属性,不要使用该属性)设置为从中返回的数据model挂钩。

因此,只需从控制器中删除content属性和init函数,并在模型中实现该挂钩,您应该好好去。