无法使用ember-model从计算属性中获取数据

时间:2013-08-28 17:35:39

标签: ember.js ember-model

我正在使用ember.jsember-model

制作应用

我有一个名为Plugin的模型,定义如下:

Eme.Plugin = Ember.Model.extend
  id: Ember.attr()
  name: Ember.attr()
  description: Ember.attr()
  downloads: Ember.attr()
  tags: Ember.attr()

Eme.Plugin.url = "/api/v1/plugins"
Eme.Plugin.adapter = Ember.RESTAdapter.create()
Eme.Plugin.collectionKey = 'plugins'

我希望在index.hbs(我使用ember-rails

中下载最多的节目

我在IndexRoute的{​​{1}}挂钩中获取数据:

setupController

输出:

Eme.IndexRoute = Em.Route.extend

  setupController: (controller, model)->
    console.log Eme.Plugin.findAll().toArray()
    controller.set 'plugins', Eme.Plugin.findAll()

但是在Chrome控制台中我执行[nextObject: function, firstObject: undefined, lastObject: undefined, contains: function, getEach: function…] ,我得到的结果如下:

Eme.Plugin.findAll().toArray()

在我的[{ __ember1377710636537: "ember404" __ember1377710636537_meta: Meta _dirtyAttributes: Array[0] _reference: Object _super: undefined get _data: function() {} isLoaded: true isNew: false set _data: function(value) {} __proto__: Object }, { ... }, { ... }] 中有一个计算属性:

IndexController

并且我迭代Eme.IndexController = Em.Controller.extend mostDownloads:(-> # console.log @get('plugins').slice(0, 3) @get('plugins').slice(0, 3) ).property('plugins') ,但没有任何内容可以显示,但是当我输出mostDownloads时,我无法获得所有数据的计数

谁可以帮助我?

2 个答案:

答案 0 :(得分:1)

插件看起来像一个数组,需要使用。@ each迭代器,如下所示:

Eme.IndexController = Em.Controller.extend({
    // Code
}).property('plugins.@each')

以下是@each http://emberjs.com/guides/object-model/computed-properties-and-aggregate-data/

的文档

关于你的数组长度,我从来没有用过.length,我通常做的长度

plugins.get('length')

希望有所帮助!

答案 1 :(得分:0)

我建议进行两项更改,让您的应用有效。

第一

我认为,因为它被称为plugins (复数),对.findAll()的调用会返回plugins数组,为此,您应该更改控制器类型成为ArrayController。然后因为您正在使用@ aka。在您的计算属性中this,您应该使用粗箭头=>来正确引用this,因此生成的IndexController应如下所示:

Eme.IndexController = Em.ArrayController.extend

  mostDownloads:(=>
    # console.log @get('content').slice(0, 3)
    @get('content').slice(0, 3)
  ).property('content.[]')

另请注意,我们观察content.[]这会在内容数组更改,项目添加或删除等时触发。您也可以使用content.@each但这更适合在需要观察更改时数组中plugin记录的属性,例如content.@each.name

第二

现在也改变你在控制器上设置plugins集合的方式,你应该设置控制器的content属性,因为它是它的用途:

Eme.IndexRoute = Em.Route.extend

  setupController: (controller, model)->
    # console.log Eme.Plugin.findAll().toArray()
    controller.set 'content', Eme.Plugin.findAll()

这一行console.log Eme.Plugin.findAll().toArray()将无法按预期的方式工作,因为当你调用它时它会给你一个回复而不是仍在进行的数组(异步......)。

最后一次更改,要打印插件长度,请使用afterModel的{​​{1}}挂钩,因为这是解决IndexRoute承诺的正确时间(异步操作已经对您的应用程序进行了控制。)

model

希望它有所帮助。