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

Ember.js: Using an ArrayController without a route?

本文关键字:路由 ArrayController js Ember      更新时间:2023-09-26

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

创建应用程序和Ember数据:

var App = Ember.Application.create();
App.ApplicationAdapter = DS.FixtureAdapter;
App.Store = DS.Store.extend({
  adapter: 'DS.FixtureAdapter'
});

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

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的属性'find'"。

我尝试了App.Store.find('category'),结果出现了错误"Uncaught TypeError:undefined不是函数"。

任何帮助或向正确方向推动都将不胜感激。我有一种感觉,我甚至没有朝着正确的方向前进。

有几件事。

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

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

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

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

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