1

我正在制作一个应用ember.js程序ember-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

我在IndexRoutesetupController钩子中获取数据:

Eme.IndexRoute = Em.Route.extend

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

输出 :

[nextObject: function, firstObject: undefined, lastObject: undefined, contains: function, getEach: function…]

但是在我执行的chrome控制台中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但没有什么可显示的,但是当我输出时{{plugins.length}},我无法获得所有数据的计数

谁能帮我一把?

4

2 回答 2

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')

希望有帮助!

于 2013-08-28T18:22:55.070 回答
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()不会按您期望的方式工作,因为当您调用它时,它会给您一个承诺,而不是仍在进行中的数组(异步...)。

最后一个更改,要打印插件长度,请使用afterModelyour 的钩子IndexRoute,因为这是解决承诺的正确时间model(异步操作已将控制权交还给您的应用程序)。

Eme.IndexRoute = Em.Route.extend
  ...
  afterModel: (plugins, transition) ->
    console.log plugins.get 'length'
  ...

希望能帮助到你。

于 2013-08-28T18:25:26.747 回答