我有一个使用ui.router包进行URL路由的Angular应用程序。我想更改它,以便如果用户尝试导航到他们已经在的页面,则路由器会重新加载该状态,而不是什么也不做。对于每个http://angular- ui.github.io/ui-router/site/#/api/ui.router.state。$ state#go,$ state.go 确实 采用了一个重载参数来实现此目的,但是它默认为false。现在,把一个对$ state.go的每个调用以及我的代码中的每个ui- sref都重写为reload设置为一个不好的主意。我想要的是一种为$ state.go更改该参数的默认值的方法,否则,至少是ui-sref装饰器。
在http://angular-tips.com/blog/2013/09/experiment-decorating- directives/之后,我尝试至少扩展ui-sref指令(因为这些指令比显式指令多得多) $ state.go电话)
myApp.config(function($provide) { // override ui-sref to have the reload option default to true. $provide.decorator('uiSrefDirective', function($delegate){ var directive = $delegate[0]; var link = directive.link; directive.compile = function() { return function(scope, element, attrs) { if(attrs.uiSrefOpts == null){ attrs.uiSrefOpts = {}; } if(attrs.uiSrefOpts.reload == null){ attrs.uiSrefOpts.reload = true; } console.log(arguments); link.apply(this, arguments); }; }; return $delegate; });
但是,这实际上似乎并没有完成任何事情,即使这样做,也实际上不会影响$ state.go。没有人知道如何在ui.router代码中手动更改行为,而无需手动更改?
我在下面调整了您的方法。我们将从 装饰中 受益,但不能从该指令中受益。正如我们可以在此处检查的那样,在ui- sref指令源代码中,单击事件实际上会调用:
ui- sref
$state.go(ref.state, params, options);
因此,我们可以装饰$state提供程序,这可能非常简单:
$state
.config(function ($provide) { $provide.decorator('$state', function ($delegate) { // let's locally use 'state' name var state = $delegate; // let's extend this object with new function // 'baseGo', which in fact, will keep the reference // to the original 'go' function state.baseGo = state.go; // here comes our new 'go' decoration var go = function (to, params, options) { options = options || {}; // only in case of missing 'reload' // append our explicit 'true' if (angular.isUndefined(options.reload)) { options.reload = true; } // return processing to the 'baseGo' - original this.baseGo(to, params, options); }; // assign new 'go', right now decorating the old 'go' state.go = go; return $delegate; }); })
这就足够了。现在,任何状态更改 _(包括单击ui-sref)_都将触发reload。
ui-sref
reload
注意:只能说,我不认为这是这样做的。 一直触发重载…对我来说,实际上我们实际上失去了很多,失去了钻石带来的优势-ui-router
ui-router