首页
学习
活动
专区
工具
TVP
发布
社区首页 >问答首页 >在路由之间传递参数

在路由之间传递参数
EN

Stack Overflow用户
提问于 2013-10-01 00:10:57
回答 5查看 19.8K关注 0票数 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代码,以了解这是否可以工作,但它似乎违反了约定,所以这是我的“糟糕的选择”。

EN

回答 5

Stack Overflow用户

回答已采纳

发布于 2013-10-01 14:28:22

您可以使用needs API (请阅读here):

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

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

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

票数 6
EN

Stack Overflow用户

发布于 2013-11-13 16:06:49

transitionTo & transitionToRoute返回一个“类似promise”的对象。解析此对象的参数是路由,您可以从该路由访问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。在这种情况下,我的答案是有价值的。

堆栈溢出对开发社区的主要价值不是你发布的问题的直接答案,而是大量不断增长的可谷歌开发知识财富。当你从用户的问题中“推断”他们“应该”做的事情而不是他们所问的如何做的时候,你可能是对的(或者你可能只是无法想象他们的特定情况),但是如果你只用你的recommendation/rule/aphorism/cargo-cult-dictum回答而不是回答实际的问题,你就会削弱其他人的谷歌搜索的价值。如果你想让某人做一些不同于他们所要求的事情,可以在评论中,或者在回答实际问题的脚注中这样做。

票数 46
EN

Stack Overflow用户

发布于 2015-05-21 07:26:30

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

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

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

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

这种解决方案的一个缺点是,my_param的值将在URL中序列化-因此它不适用于您可能想要在路由之间传递的一些敏感信息。

票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/19098901

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档