Ember将模型传递给transitionToRoute

时间:2015-06-15 19:05:04

标签: ember.js ember-cli ember-router ember-controllers

我使用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;

3 个答案:

答案 0 :(得分:1)

您正在处理许多Ember应用程序中出现的经典问题,即如何处理“新”/“创建”情况。

您无法定义路线,例如

this.route('addcontact', { path: /addcontact/:thing_id }

因为新联系人没有id,直到它被持久化到服务器,此时它不再是新的。

然而,在您的应用程序中有一点,在您的情况下,我想在“主页”页面上,用户按下“新建联系人”按钮,它可能包含有关创建内容或如何创建它的有用信息,甚至可能希望使用this.store.createRecord在那里创建对象 - 但是如何将该信息或新记录传递给addcontacdt路径,该路由可能没有动态段?

一些想法包括:

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

  2. 使用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)。