在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代码,以了解这是否可以工作,但它似乎违反了约定,所以这是我的“糟糕的选择”。
发布于 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
被调用。
发布于 2013-11-13 16:06:49
transitionTo
& transitionToRoute
返回一个“类似promise”的对象。解析此对象的参数是路由,您可以从该路由访问controller
和currentModel
。因此,将信息传递到您要转换到的路由的一个很好的、简洁的方法是:
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回答而不是回答实际的问题,你就会削弱其他人的谷歌搜索的价值。如果你想让某人做一些不同于他们所要求的事情,可以在评论中,或者在回答实际问题的脚注中这样做。
发布于 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中序列化-因此它不适用于您可能想要在路由之间传递的一些敏感信息。
https://stackoverflow.com/questions/19098901
复制相似问题