将对象模型作为单个对象传递给ArrayController

时间:2013-04-10 01:11:26

标签: javascript ember.js

我有一个起始页面,要求用户输入apiKey。使用该表单数据,我将其传递给我的deals路由,然后根据输入的apiKey获取相关数据。

我的问题是,当我直接在URI中使用apiKey加载交易页面时,它可以正常工作,但是,当从start页面上的表单开始并使用{{提交时1}},我收到以下错误:

apiKey

这是app.js:

Uncaught Error: assertion failed: an Ember.CollectionView's content must implement Ember.Array. You passed 'asdf'

这是HTML:

App = Ember.Application.create();

App.Store = DS.Store.extend({
  revision: 12,
  adapter: 'DS.FixtureAdapter'
});

App.Deal = DS.Model.extend({
  name: DS.attr('string')
});

App.Deal.FIXTURES = [
  {id: 1, name: 'Deal 1'},
  {id: 2, name: 'Deal 2'}
]

App.Router.map(function() {
  this.resource('start', { path: '/' });
  this.resource('deals', { path: '/deals/:api_key' });
});

App.StartController = Ember.ObjectController.extend({
  apiKey: '',
  getDeals: function (model) {
    this.transitionToRoute('deals', this.apiKey);
  }
});

App.DealsRoute = Ember.Route.extend({
  model: function() {
    // return App.Deal.getWonFor(params.api_key);
    return App.Deal.find();
  }
});

App.DealController = Ember.ArrayController.extend({
});

App.DealsView = Ember.View.extend({
  didInsertElement: function() {
    // Add active class to first item
    this.$().find('.item').first().addClass('active');
    this.$().find('.carousel').carousel({interval: 1000});
  }
});

1 个答案:

答案 0 :(得分:1)

这里的问题是当你将第二个参数传递给Route#transitionTo时,Ember.js会假设你传递模型并将其设置为控制器的模型,而不是使用model钩子。 / p>

问题在于:

this.transitionToRoute('deals', this.apiKey);

现在Ember.js认为this.apiKey是您路线的模型,并且会跳过调用路线的model挂钩并直接设置您传递的内容作为控制器的模型。

我可以想出两种解决方法:

方法1(首选)

您可以创建一个包装deals资源的新资源:

this.resource('api', { path: '/:api_key' }, function() {
  this.resource('deals');
});

然后:

App.ApiRoute = Ember.Route.extend({
  model: function(params) {
    return params.api_key;
  }
});

App.DealsRoute = Ember.Route.extend({
  model: function() {
    return App.Deal.getWonFor(this.modelFor('api'));
  }
});

getDeals: function () {
  this.transitionToRoute('deals', this.apiKey);
}

方法2

以下是一个快速解决方法(可能不是最佳的),但应该有效:

getDeals: function () {
  var router = this.get('target'),
      url = '/deals/' + this.apiKey;

  Ember.run.once(function() {
    router.get('location').setURL(url);
    router.notifyPropertyChange('url');
  });

  this.router.router.handleURL(url);
}