Ember.js 如何将{{link to}}helper重构成一个可以在Transitionon中使用的函数?
我目前使用由其他人编写的{{link to}}helper来显式声明要传递到下一个路由的查询参数,并去掉其他未声明的参数。看起来是这样的:Ember.js 如何将{{link to}}helper重构成一个可以在Transitionon中使用的函数?,ember.js,Ember.js,我目前使用由其他人编写的{{link to}}helper来显式声明要传递到下一个路由的查询参数,并去掉其他未声明的参数。看起来是这样的: //link-to example {{#link-to 'route' (explicit-query-params fromDate=thisDate toDate=thisDate)} Link Text {{/link-to}} //the helper import {helper} from '@ember/component/helper
//link-to example
{{#link-to 'route' (explicit-query-params fromDate=thisDate toDate=thisDate)} Link Text {{/link-to}}
//the helper
import {helper} from '@ember/component/helper';
import Object from '@ember/object';
import {assign} from '@ember/polyfills';
export function explicitQueryParams(params, hash) {
let values = assign({}, hash);
values._explicitQueryParams = true;
return Object.create({
isQueryParams: true,
values,
});
}
export default helper(explicitQueryParams);
// supporting method in router.js
const Router = EmberRouter.extend({
_hydrateUnsuppliedQueryParams(state, queryParams) {
if (queryParams._explicitQueryParams) {
delete queryParams._explicitQueryParams;
return queryParams;
}
return this._super(state, queryParams);
},
});
我最近遇到了一个用例,我需要将相同的逻辑应用于transitiono()
,该逻辑用于根据用户的访问权限从路由重定向用户:
beforeModel() {
if (auth) {
this.transitionTo('route')
} else {
this.transitionTo('access-denied-route')
}
},
我真的很难看到如何将我在Handlebar helper中拥有的东西重构为transitiono()
段中的可重用函数。我甚至不确定transitiono()
是否转发与{{link to}}
相同的参数,或者是否必须从不同的位置获取queryParams
任何洞察都将不胜感激。首先,利用像
这样的私有方法是有风险的。这将使升级更加困难。大多数人使用resetController
清除粘贴查询参数。还可以通过在转换上传递空值来明确清除默认值
但是,我会咬一口,因为弄明白这一点很有趣:)检查一下这个,它能满足你的需要
如果您从过渡到
案例开始工作,我们可以在实现中看到:
transitionTo(...args) {
let queryParams;
let arg = args[0];
if (resemblesURL(arg)) {
return this._doURLTransition('transitionTo', arg);
}
let possibleQueryParams = args[args.length - 1];
if (possibleQueryParams && possibleQueryParams.hasOwnProperty('queryParams')) {
queryParams = args.pop().queryParams;
} else {
queryParams = {};
}
let targetRouteName = args.shift();
return this._doTransition(targetRouteName, args, queryParams);
}
因此,如果最后一个参数是一个带有查询参数obj的对象,它将直接进入\u doTransition
,最终调用:
_prepareQueryParams(targetRouteName, models, queryParams, _fromRouterService) {
let state = calculatePostTransitionState(this, targetRouteName, models);
this._hydrateUnsuppliedQueryParams(state, queryParams, _fromRouterService);
this._serializeQueryParams(state.handlerInfos, queryParams);
if (!_fromRouterService) {
this._pruneDefaultQueryParamValues(state.handlerInfos, queryParams);
}
}
它具有\u未应用的查询参数
功能。因此,要使所有这些都起作用,您不能直接从您创建的帮助程序
共享函数。相反,只需将\u explicitQueryParams:true
添加到查询参数中即可。工作完成:)
指向
版本的链接不同。查询参数使用
let queryParams = get(this, 'queryParams.values');
由于到
组件的链接可以采用不同数量的动态段,因此需要有某种方法来区分传递的动态段、传递的模型和查询参数 首先,利用像这样的私有方法是有风险的。这将使升级更加困难。大多数人使用resetController
清除粘贴查询参数。还可以通过在转换上传递空值来明确清除默认值
但是,我会咬一口,因为弄明白这一点很有趣:)检查一下这个,它能满足你的需要
如果您从过渡到
案例开始工作,我们可以在实现中看到:
transitionTo(...args) {
let queryParams;
let arg = args[0];
if (resemblesURL(arg)) {
return this._doURLTransition('transitionTo', arg);
}
let possibleQueryParams = args[args.length - 1];
if (possibleQueryParams && possibleQueryParams.hasOwnProperty('queryParams')) {
queryParams = args.pop().queryParams;
} else {
queryParams = {};
}
let targetRouteName = args.shift();
return this._doTransition(targetRouteName, args, queryParams);
}
因此,如果最后一个参数是一个带有查询参数obj的对象,它将直接进入\u doTransition
,最终调用:
_prepareQueryParams(targetRouteName, models, queryParams, _fromRouterService) {
let state = calculatePostTransitionState(this, targetRouteName, models);
this._hydrateUnsuppliedQueryParams(state, queryParams, _fromRouterService);
this._serializeQueryParams(state.handlerInfos, queryParams);
if (!_fromRouterService) {
this._pruneDefaultQueryParamValues(state.handlerInfos, queryParams);
}
}
它具有\u未应用的查询参数
功能。因此,要使所有这些都起作用,您不能直接从您创建的帮助程序
共享函数。相反,只需将\u explicitQueryParams:true
添加到查询参数中即可。工作完成:)
指向
版本的链接不同。查询参数使用
let queryParams = get(this, 'queryParams.values');
由于到
组件的链接可以采用不同数量的动态段,因此需要有某种方法来区分传递的动态段、传递的模型和查询参数 这是一个令人难以置信的答案,谢谢你的时间和玩弄。作为一名新的开发人员,我从来没有想到过框架提供商会做什么——我认为他们是理所当然的。还感谢您提供有关resetController
的说明。通过查看文档,我可以看到这也提供了一个解决方案,这是一个令人难以置信的答案,感谢您抽出时间来玩乐。作为一名新的开发人员,我从来没有想到过框架提供商会做什么——我认为他们是理所当然的。还感谢您提供有关resetController
的说明。通过查看文档,我可以了解这是如何提供解决方案的