我使用Ember-cli和ember 1.11
我尝试在控制器中使用transitionToRoute方法转换为路径,并将动态生成的对象作为模型提供给它。
这是我的控制人员:
import Ember from 'ember';
export default Ember.Controller.extend({
actions: {
launch_scanner: function(){
console.log('launch_scanner');
var model = {name: "Edward", phone: "123", email: "email@test.com"};
//the final app will pull the model variable from a QR scanner
this.transitionToRoute('addcontact', model);
}
}
});
当我触发此操作时,transitionToRoute方法会导致此错误:
未捕获错误:传递了更多上下文对象 路线的动态细分:addcontact
如果我省略了模型参数,它就会转换到addcontact路由就好了。我做错了什么?
这是我的路由器文件:
import Ember from 'ember';
import config from './config/environment';
var Router = Ember.Router.extend({
location: config.locationType
});
Router.map(function() {
this.route('home', {path: '/'});
this.resource('addcontact', {path: '/addcontact'});
});
export default Router;
答案 0 :(得分:1)
您正在处理许多Ember应用程序中出现的经典问题,即如何处理“新”/“创建”情况。
您无法定义路线,例如
this.route('addcontact', { path: /addcontact/:thing_id }
因为新联系人没有id,直到它被持久化到服务器,此时它不再是新的。
然而,在您的应用程序中有一点,在您的情况下,我想在“主页”页面上,用户按下“新建联系人”按钮,它可能包含有关创建内容或如何创建它的有用信息,甚至可能希望使用this.store.createRecord
在那里创建对象 - 但是如何将该信息或新记录传递给addcontacdt
路径,该路由可能没有动态段?
一些想法包括:
在home
路线或其他任何地方创建新联系人,并将其存储在控制器中。然后,在新路线的model
挂钩中,使用this.controllerFor('home').get('newContact')
检索它。
使用addcontact
将创建新对象(如果有)的必要参数作为查询参数传递到transitionTo('newcontact', queryParameters)
路径。然后,在model
钩子中,使用this.store.createRecord('contact', transition.queryParameters)
或类似的东西创建新对象。
答案 1 :(得分:0)
这是正常的,因为您的addContact路线中没有任何动态细分。您应该将路由器更改为
Router.map(function() {
this.route('home', {path: '/'});
this.resource('addcontact', {path: '/addcontact/:id'});
});
现在你可以传递模型Id而不是整个模型来触发model
钩子。或者,您可以传递整个模型,但不会触发model
挂钩。虽然您仍然可以在afterModel
挂钩中修改模型。
答案 2 :(得分:0)
如果您想导航到未保存记录的子路由,您有2个选项
在转换到路线之前保存模型
model.save().then(function(result){
self.transitionToRoute('route',result.id)
});
如果您不想保存模型,可以在createRecord中为模型生成ID(也许用户可以取消,您也不想处理删除)
具有相同ID的低潜力的id创建的基本功能是:
generateIdForRecord: function() {
var d = new Date().getTime();
var uuid = 'xxxxyyyxxxxxxxxyyxyxxxyyy'.replace(/[xy]/g, function(c){
var r = (d + Math.random() * 16) % 16 | 0;
d = Math.floor(d / 16);
return (c === 'x' ? r : (r & 0x7 | 0x8)).toString(16);
});
return uuid;
}
使用这种方法,尚未保存的模型有一个要转换的id,只考虑处理来自该路由的转换,因为在保存模型后,当前id不再有效(模型在响应中从服务器获取实际id)。