【问题标题】:ArrayProxy expects an Array or Ember.ArrayProxy, but you passed objectArrayProxy 需要一个 Array 或 Ember.ArrayProxy,但您传递了对象
【发布时间】:2014-12-22 16:04:28
【问题描述】:

我收到此错误:

ArrayProxy expects an Array or Ember.ArrayProxy, but you passed object

我正在使用 active-model-serializers 从 rails 应用程序获取数据。数据显示在我的 ember 检查器中,但我的模板在控制台中出现此错误时无法正确呈现。

Router.map(function() {
  this.resource('brands', function() {
    this.resource('brand', { path: '/:brand_id' });
  });

  this.resource('campaigns', function() {
    this.resource('campaign', { path: '/:campaign_id' },
    this.resource('index'), { path: 'brands/:brand_id' });
  });
});

export default Ember.Route.extend({
  model: function() {
    return Ember.RSVP.hash({
      brand: this.store.find('brand'),
      campaign: this.store.find('campaign') 
    });
  }
});

export default DS.Model.extend({
  name: DS.attr('string'),
  facebook_page_id: DS.attr('string'),
  active: DS.attr('boolean'),
  facebook_uid: DS.attr('string'),
  facebook_token: DS.attr('string'),
  facebook_token_expires: DS.attr('string'),
  website_url: DS.attr('string'),
  privacy_policy_link: DS.attr('string'),
  terms_link: DS.attr('string'),
  instagram_account: DS.attr('string'),
  instagram_url: DS.attr('string'),
  twitter_account: DS.attr('string'),
  twitter_url: DS.attr('string'),
  avatar_url: DS.attr('string'),
  youtube_account: DS.attr('string'),
  youtube_url: DS.attr('string'),
  favicon_url: DS.attr('string'),
  open_graph_url: DS.attr('string'),
  campaigns: DS.hasMany('campaign', {async: true})
});

export default DS.Model.extend({
  name: DS.attr('string'),
  brand_id: DS.attr('string'),
  brand: DS.belongsTo('brand', {async: true})
});

{{#each brand in controller}}
  <a>
    {{#link-to 'brand' this}}
       {{brand.name}} 
     {{/link-to}}
   </a>
{{else}}
   <a>No brands found.</a>
{{/each}}

服务器日志中没有错误。

【问题讨论】:

    标签: ember.js ember-data active-model-serializers


    【解决方案1】:

    Embers 默认的索引控制器是ArrayControllers,它期望他们的模型是一个数组。 在 的模型钩子中 - 看起来是 - 您的 BrandsIndexRoute 您将模型指定为

    Ember.RSVP.hash({
      brand: this.store.find('brand'),
      campaign: this.store.find('campaign') 
    });
    

    返回 single object,而不是预期的 array of brands
    你应该做的是:

    //brands route
    export default Ember.Route.extend({
      model: function() {
        return this.store.find('brand');
      }
    });
    
    //campaigns route
    export default Ember.Route.extend({
      model: function() {
        return this.store.find('campaign');
      }
    });
    

    【讨论】:

    • 没有路由默认到任何特定的控制器类型,如果没有指定控制器类型,它会根据模型钩子返回的数据类型来判断控制器类型。 github.com/emberjs/ember.js/blob/…
    • 这是我原来做的,想在同一个模板上查看数据。感谢我们的帮助。
    【解决方案2】:

    您正在尝试迭代控制器,但您的控制器正在装饰一个带有两个属性的对象,而不是一个数组。您的对象如下所示:

    {
      brand: [...],
      campaign: [...]
    }
    

    此外,如果您将控制器定义为数组控制器,它将引发此错误(我猜这是真的发生了)。因为您将对象而不是数组传递给控制器​​。

    【讨论】:

    • 当我使用对象控制器时,错误读取它是预期的和 ArrayControlller?
    • 你的意思是说每个控制器都需要一个数组?
    猜你喜欢
    • 2015-11-12
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-06-07
    • 1970-01-01
    • 2023-03-14
    • 1970-01-01
    • 2015-02-12
    相关资源
    最近更新 更多