Ember 将模型传递给 transitionToRoute
Ember passing a model to transitionToRoute
我正在使用 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 方法导致此错误:
Uncaught Error: More context objects were passed than there are
dynamic segments for the route: 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;
这很正常,因为您的 addContact 路由中没有任何动态分段。您应该将路由器更改为
Router.map(function() {
this.route('home', {path: '/'});
this.resource('addcontact', {path: '/addcontact/:id'});
});
现在您可以传递模型 ID 而不是整个模型来触发 model
挂钩。或者你可以传递整个模型,但它不会触发 model
挂钩。尽管您仍然可以在 afterModel
挂钩中修改您的模型。
您正在处理许多 Ember 应用程序中出现的经典问题,即如何处理 "new"/"create" 情况。
您不能定义诸如
的路线
this.route('addcontact', { path: /addcontact/:thing_id }
因为新联系人没有 id,只有在持久化到服务器后才会有,此时它就不再是新的了。
但是您的应用程序中有一些要点,在您的情况下,我想在 "home" 页面上,用户在该页面上按下了 "New Contact" 按钮,它可能包含有关创建内容的有用信息或如何创建它,甚至可能想使用 this.store.createRecord
在那里创建对象——但是如何将该信息或新记录传递到 addcontacdt
路由,该路由可能没有动态细分?
一些想法包括:
在您的 home
路线或其他任何地方创建新联系人,并将其存储在控制器中。然后,在新路由的 model
钩子中,使用 this.controllerFor('home').get('newContact')
.
检索它
将创建新对象的必要参数(如果有)作为查询参数传递给addcontact
路由,使用transitionTo('newcontact', queryParameters)
.然后,在 model
挂钩中,使用 this.store.createRecord('contact', transition.queryParameters)
或等效的东西创建新对象。
如果您想导航到未保存记录的子路径,您有 2 个选项
要么在转换到路线之前保存模型
model.save().then(function(result){
self.transitionToRoute('route',result.id)
});
或者如果您不想保存模型(也许用户可以取消并且您不想处理删除),则在 createRecord 中为模型生成一个 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 作为响应).
我正在使用 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 方法导致此错误:
Uncaught Error: More context objects were passed than there are dynamic segments for the route: 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;
这很正常,因为您的 addContact 路由中没有任何动态分段。您应该将路由器更改为
Router.map(function() {
this.route('home', {path: '/'});
this.resource('addcontact', {path: '/addcontact/:id'});
});
现在您可以传递模型 ID 而不是整个模型来触发 model
挂钩。或者你可以传递整个模型,但它不会触发 model
挂钩。尽管您仍然可以在 afterModel
挂钩中修改您的模型。
您正在处理许多 Ember 应用程序中出现的经典问题,即如何处理 "new"/"create" 情况。
您不能定义诸如
的路线this.route('addcontact', { path: /addcontact/:thing_id }
因为新联系人没有 id,只有在持久化到服务器后才会有,此时它就不再是新的了。
但是您的应用程序中有一些要点,在您的情况下,我想在 "home" 页面上,用户在该页面上按下了 "New Contact" 按钮,它可能包含有关创建内容的有用信息或如何创建它,甚至可能想使用 this.store.createRecord
在那里创建对象——但是如何将该信息或新记录传递到 addcontacdt
路由,该路由可能没有动态细分?
一些想法包括:
在您的
home
路线或其他任何地方创建新联系人,并将其存储在控制器中。然后,在新路由的model
钩子中,使用this.controllerFor('home').get('newContact')
. 检索它
将创建新对象的必要参数(如果有)作为查询参数传递给
addcontact
路由,使用transitionTo('newcontact', queryParameters)
.然后,在model
挂钩中,使用this.store.createRecord('contact', transition.queryParameters)
或等效的东西创建新对象。
如果您想导航到未保存记录的子路径,您有 2 个选项
要么在转换到路线之前保存模型
model.save().then(function(result){
self.transitionToRoute('route',result.id)
});
或者如果您不想保存模型(也许用户可以取消并且您不想处理删除),则在 createRecord 中为模型生成一个 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 作为响应).