Ember.js 如何将{{link to}}helper重构成一个可以在Transitionon中使用的函数?

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}}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
的说明。通过查看文档,我可以了解这是如何提供解决方案的