3

我将 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;
4

3 回答 3

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)modelthis.store.createRecord('contact', transition.queryParameters)

于 2015-06-15T19:46:41.370 回答
0

这很正常,因为您的 addContact 路由中没有任何动态段。你应该把你的路由器改成

Router.map(function() {
  this.route('home', {path: '/'});
  this.resource('addcontact', {path: '/addcontact/:id'});
});

现在您可以传递模型 ID 而不是整个模型来触发model钩子。或者,您可以传递整个模型,但它不会触发model钩子。虽然你仍然可以在afterModel钩子中修改你的模型。

于 2015-06-15T19:21:35.283 回答
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 作为响应)。

于 2015-10-13T15:55:19.577 回答