17

Ember 中将参数从一条路由发送到另一条路由的“适当”方式是什么?例如,我有两条这样定义的路线:

this.resource('activities', { path: '/activities/:on_date' }, function() {
    this.route('new');
});

ActivitiesRoute用户打开时,会显示可能活动的下拉列表。当他们选择某些东西时,它会转换为ActivitiesNewRoute

this.transitionToRoute('activities.new');

而且我知道该方法中有第二个参数可用,transitionToRoute(route,model)但它用于传递模型,我假设这不应该重新用于其他参数传递。在这种情况下,下拉选项是选择Action模型 id,ActivitiesNew 的模型是Activity.

以下是我对可能可行的方式的三个猜测:

1)使其成为路由器参数

我想我可以更改ActivitiesNew为包含一个“参数”作为路线的一部分:

this.route('new', { path: '/new/:my_parameter' });

我不确定我是否真的希望它成为 URL 路径的一部分,但如果这是流行的约定,那么我会接受它。

2)获取句柄,过渡后

在 transitionToRoute 调用之后,我可以立即设置新控制器类的属性。不确定控制器是否已经设置好,但我在想像:

this.transitionToRoute('activities.new');
this.get('target').controllerFor('activities.new').set('my_parameter', myValue);

3)使用模型参数

this.transitionToRoute('activities.new',myValue);

我怀疑这是一个重大的禁忌。我还没有查看 Ember 代码来知道这是否可行,但它似乎违反约定,所以这是我的“坏选择”。

4

5 回答 5

46

transitionTo&transitionToRoute返回一个“类似承诺”的对象。解析此对象的参数是路由,您可以从中访问controllercurrentModel。因此,将信息传递给您正在转换的路线的一种很好的干净方式是:

var my_param = ....;
this.transitionToRoute('activities.new').then(function(newRoute) {
  newRoute.currentModel.set('someProperty', my_param);
  //or
  newRoute.controller.set('someProperty', my_param);
});

编辑/咆哮:

请注意,在大多数情况下,您确实希望needs在控制器之间使用 , 和绑定东西。但是,在某些情况下,您的某些事情依赖于路由转换的逻辑——例如,如果我们从 routeB 来到 routeA,controllerB 的状态为 X,但如果我们来自 routeC,则状态为 Y。在这种情况下,我的回答很有价值。

堆栈溢出对开发社区的主要价值不是您发布问题的即时答案,而是大量不断增长的可谷歌开发知识财富。当您从用户的问题中“推断”出他们“应该”做的事情不是他们询问如何做的事情时,您可能是对的(或者您可能只是无法想象他们的特定情况),但如果您只回答用你的推荐/规则/格言/cargo-cult-dictum 而不是回答实际问题,你会降低其他人谷歌搜索的价值。如果您想告诉某人做他们所要求的以外的事情,请在评论中或在实际问题答案的脚注中进行。

于 2013-11-13T08:06:48.930 回答
6

您可以使用API(在此处needs阅读):

App.ActivitiesNewController = Ember.ObjectController.extend({
  needs: ['activities']

  // Bind the property you need
  actionTemplateBinding: 'controllers.activities.actionTemplate'
});

所以你真正需要的是在控制器之间传递一个参数,这正是needs它的用途。另外,将属性与您绑定可needs确保它始终保持同步,而不是依赖于setupController被调用。

于 2013-10-01T06:28:21.707 回答
2

您可以使用查询参数(http://guides.emberjs.com/v1.10.0/routing/query-params/),如下所示:

this.transitionToRoute('activities.new', {queryParams: {my_param: 'my_value'});

为了能够my_paramnew控制器中接收,您还需要定义以下行:

App.ActivitiesNewController = Ember.ObjectController.extend({
    queryParams: ['my_param'],
    my_param: ''
    ...
});

此解决方案的一个缺点是 的值my_param将在 URL 中序列化 - 因此它不适合您可能希望在路由之间传递的某些敏感信息。

于 2015-05-20T23:26:30.457 回答
0

我将用我现在决定使用的内容来回答我的问题,但请保持开放几天,看看是否有人会提供更有经验的答案。我的回答可能非常好......无论如何它都有效。

我已经从问题中选择了#2的变体。不同之处在于,我没有尝试ActivitiesNewActivities控制器中设置控制器中的属性,而是相反:

ActivitiesNewRoute

App.ActivitiesNewRoute = Ember.Route.extend({
    model: function(params) {
        return this.store.createRecord('activity');
    },
    setupController: function(controller,model) {
        controller.set('actionTemplate', this.controllerFor('activities').get('actionTemplate'));
    }
});

如果有更好的方法,仍然有兴趣听取人们的意见。

于 2013-09-30T19:50:25.713 回答
0

使用参数和设置模型过渡到路由

yourAction:->
    model = 'your-model'
    route = 'your.path.to.toute'
    routeLoad = @transitionToRoute route,
        id: model.get 'id'
    routeLoad.then (route) ->
        route.set 'controller.model', model
    return
于 2015-08-19T09:09:16.217 回答