在ui.router中更改$ state.go()的默认行为以默认重新加载

时间:2014-04-17 22:32:02

标签: angularjs angular-ui-router

我有一个使用ui.router包构建的Angular应用程序用于URL路由。我想更改它,以便如果用户尝试导航到他们已经打开的页面,路由器会重新加载该状态而不是什么也不做。每http://angular-ui.github.io/ui-router/site/#/api/ui.router.state。$ state#go,$ state.go 采取一个重新加载参数,该参数将完全相同,但默认为false。现在,在我的代码中重写每个调用$ state.go和每个ui-sref以将reload设置为true都是一个糟糕的想法。我想要的是为$ 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代码中手动更改这种行为?

1 个答案:

答案 0 :(得分:19)

我在下面调整了你的方法。我们将从装饰中获利,但不会从指令中获益。我们可以在这里查看,在ui-sref directive源代码中,click事件实际上会调用:

$state.go(ref.state, params, options); 

因此,我们可以装饰$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-router