首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >无法从带有成员模型的计算属性中获取数据

无法从带有成员模型的计算属性中获取数据
EN

Stack Overflow用户
提问于 2013-08-28 17:35:39
回答 2查看 1.6K关注 0票数 1

我正在用ember.jsember-model做一个应用程序

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

代码语言:javascript
复制
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钩子中获取数据:

代码语言:javascript
复制
Eme.IndexRoute = Em.Route.extend

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

产出:

代码语言:javascript
复制
[nextObject: function, firstObject: undefined, lastObject: undefined, contains: function, getEach: function…]

但是,在铬控制台中,我执行Eme.Plugin.findAll().toArray(),得到了如下结果:

代码语言:javascript
复制
[{
  __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中有一个计算属性:

代码语言:javascript
复制
Eme.IndexController = Em.Controller.extend

  mostDownloads:(->
    # console.log @get('plugins').slice(0, 3)
    @get('plugins').slice(0, 3)
  ).property('plugins')

我迭代mostDownloads,但是没有什么要显示的,但是当我输出{{plugins.length}}时,我无法得到所有数据的计数

谁能帮我一把?

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2013-08-28 18:22:55

插件看起来像一个数组,需要像这样使用.@each迭代器:

代码语言:javascript
复制
Eme.IndexController = Em.Controller.extend({
    // Code
}).property('plugins.@each')

以下是关于@每个http://emberjs.com/guides/object-model/computed-properties-and-aggregate-data/的文档

关于您的数组长度,我从来没有很好地使用过.length,对于长度我通常是这样做的

代码语言:javascript
复制
plugins.get('length')

希望这能帮上忙!

票数 1
EN

Stack Overflow用户

发布于 2013-08-28 18:25:26

我提议两个改变,使你的应用程序工作。

第一

由于它名为plugins (复数),因此对.findAll()的调用返回一个plugins数组以使其工作,因此您应该将控制器类型更改为ArrayController。那么,因为您使用的是@ aka。this在您的计算属性中,您应该使用fat箭头=>来正确引用this,因此得到的IndexController应该如下所示:

代码语言:javascript
复制
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属性,因为它是用于:

代码语言:javascript
复制
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承诺的合适时机(异步操作已经将控制权还给了应用程序)。

代码语言:javascript
复制
Eme.IndexRoute = Em.Route.extend
  ...
  afterModel: (plugins, transition) ->
    console.log plugins.get 'length'
  ...

希望能帮上忙。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/18494599

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档