我正在用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)
我从IndexRoute的setupController钩子中获取数据:
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…]但是,在铬控制台中,我执行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}}时,我无法得到所有数据的计数
谁能帮我一把?
发布于 2013-08-28 18:22:55
插件看起来像一个数组,需要像这样使用.@each迭代器:
Eme.IndexController = Em.Controller.extend({
// Code
}).property('plugins.@each')以下是关于@每个http://emberjs.com/guides/object-model/computed-properties-and-aggregate-data/的文档
关于您的数组长度,我从来没有很好地使用过.length,对于长度我通常是这样做的
plugins.get('length')希望这能帮上忙!
发布于 2013-08-28 18:25:26
我提议两个改变,使你的应用程序工作。
第一
由于它名为plugins (复数),因此对.findAll()的调用返回一个plugins数组以使其工作,因此您应该将控制器类型更改为ArrayController。那么,因为您使用的是@ aka。this在您的计算属性中,您应该使用fat箭头=>来正确引用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挂钩的IndexRoute,因为此时正是解决model承诺的合适时机(异步操作已经将控制权还给了应用程序)。
Eme.IndexRoute = Em.Route.extend
...
afterModel: (plugins, transition) ->
console.log plugins.get 'length'
...希望能帮上忙。
https://stackoverflow.com/questions/18494599
复制相似问题