未捕获的TypeError:this.get(...)。toArray不是函数(...)

时间:2016-12-06 21:17:52

标签: javascript ember.js model

我的Ember.js型号/控制器出了点问题。

我的代码生成此错误:

Uncaught TypeError: this.get(...).toArray is not a function(…)

我有这样的结构:

router.js

Router.map(function() {

  this.route('search', function() {
    this.route('detail', { path: '/:search_id' });
    this.route('ranks', { path: '/:search_id/ranks' });
    this.route('tweets', { path: '/:search_id/tweets' });
  });
});

export default Router;

路线/ search.js

import Ember from 'ember';

export default Ember.Route.extend({
});

路线/搜索/ rank.js

export default Ember.Route.extend({

    model(params) {
        return this.get('store').findRecord('search', params.search_id);
    },

    setupController: function(controller, model) {
        controller.set('model', model);
    }
});

应用程序/模型/ rank.js

export default DS.Model.extend({
    date: DS.attr(),
    tag: DS.attr('string'),
    rank: DS.attr('number'),
    freq: DS.attr('number'),

    search: DS.belongsTo('search')
});

应用程序/模型/ search.js

export default DS.Model.extend({
    uniqueid: DS.attr('string'),
    idate: DS.attr('date'),
    fdate: DS.attr('date'),
    keywords: DS.attr(),

    ranks: DS.hasMany('rank')
});

应用程序/控制器/ search.js

export default Ember.Controller.extend({
});

应用程序/控制器/搜索/ rank.js

export default Ember.Controller.extend({

    mydata: Ember.computed('model', function() {

       this.get('model').forEach(function(item) {
          console.log(item);
       });
    });
});

2 个答案:

答案 0 :(得分:1)

你并不是唯一一个在努力解决这个问题的人,因为我最近看到了很多问题,这些问题说明了我认为错过的余烬数据。

您致电this.store.findRecord('search', params.search_id)然后您的api根据您的评论返回以下JSON,其中包含1 search个对象和4 rank

{
  "searches":[
    { "id":90,"uniqueid":"search_all","idate":"2016-‌​12-01","fdate":"2016‌​-12-10","keywords":"‌​"}
  ], "ranks":[
    {"id":1‌​,"rank":1,"tag":"ref‌​erendum","date":"201‌​6-12-05","freq":609,‌​"search":"90"},
    {"id"‌​:2,"rank":1,"tag":"r‌​eferendum","date":"2‌​016-12-06","freq":14‌​87,"search":"90"},
    {"‌​id":3,"rank":1,"tag"‌​:"referendum","date"‌​:"2016-12-04","freq"‌​:242,"search":"90"},‌​
    {"id":4,"rank":1,"ta‌​g":"referendum","dat‌​e":"2016-12-07","fre‌​q":191,"search":"90"‌​}
  ]
}

现在,如果您已经完成了ajax请求,那么整个json blob都可以使用。但是,因为这是一个ember数据请求,而不是简单的ajax请求,所以只能获取您查询的单个搜索实例。

这不是问题,因为返回的搜索对象有一个链接来排列您也得到的项目。您可以致电search.get('ranks')并获取所有已加载的排名。

解决方案:

我建议的解决方案是在模型中收集您想要的等级并将它们传递给您的控制器。这样,如果您想独立于搜索加载它们,它将起作用

路线/搜索/ rank.js

export default Ember.Route.extend({
  model(params) {
    return this.get('store').findRecord('search', params.search_id).then((search) => {
      // Find record only returns the search object. However, that search object has easy
      // access to all of the previously retrieved rank objects
      return Ember.RSVP.hash({
        search: search,
        ranks: search.get('ranks') // <= key difference here
      });
    });
  },

  setupController: function(controller, model) {
    controller.set('search', model.search);
    controller.set('myRanks', model.ranks);
  }
});

应用程序/控制器/搜索/ rank.js

export default Ember.Controller.extend({
  // ranks are available to you here as myRanks
});

应用程序/视图/搜索/秩/ index.hbs

{{#each myRanks as |rank|}}
  <h1>{{rank.rank}}</h1>
{{/each}}

答案 1 :(得分:0)

findRecord返回Promise,它将被解析为单个记录。所以你不能将forEach用于单个记录 您可以直接访问模型内​​可用的属性,如下所示 this.get('model.tag')获取标记属性值。