我有一个起始页面,要求用户输入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});
}
});
答案 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);
}