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 路由,该路由可能没有动态细分?

一些想法包括:

  1. 在您的 home 路线或其他任何地方创建新联系人,并将其存储在控制器中。然后,在新路由的 model 钩子中,使用 this.controllerFor('home').get('newContact').

  2. 检索它
  3. 将创建新对象的必要参数(如果有)作为查询参数传递给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 作为响应).