2017-01-25 44 views
0

我正在转向我的angular 1.x应用程序中的无状态组件。在ui路由器中传递stateParams

我从控制器代码中移除了所有数据加载,并且我使用了ui-routerresolve功能。由于我在同一个$state中使用$state转换处理每个内部状态更改,因此我不想从后端获取所有数据,只有在需要时才需要(我需要不同的数据)。

为了获得这种行为,我非常依赖params。例如:

... 
.state('myapp.child', { 
    url: '/child', 
    controller: function ($state, foo, bar) { 
    function someEvent() { 
     // Provision $stateParams to prevent fetching 
     $state.go($state.current, {foo: foo, bar:bar}); 
    } 
    }, 
    params: { 
    foo: null, 
    bar: null 
    }, 
    resolve: { 
    /** 
    * @ngInject 
    */ 
    foo: function(fooService, $stateParams) { 
     if ($stateParams.foo !== null) { // <= Duplication 
     return foo; 
     } else { 
     return fooService.get(); 
     } 
    }, 
    /** 
    * @ngInject 
    */ 
    bar: function(barService, $stateParams) { 
     if ($stateParams.bar !== null) { // <= Duplication 
     return bar; 
     } else { 
     return barService.get(); 
     } 
    } 
    } 
}); 

我的问题是:有没有什么办法可以直接告诉路由器解决这些值?还是有一个很好的方法来避免在解析块中进行空检查?

回答

0

你可以使用三元和ES6(尽管ES6只是lambda)来清理它一点点。我添加了lodash函数,但您可以简单地使用===检查,因为您已经:

bar: function(barService, $stateParams) => 
    return !_.isNull($stateParams.bar) ? $stateParams.bar : barService.get() 
+0

我在某些地方使用此功能,但行数往往会变得太长。我正在寻找的是一种自动解析'bar'的方法。或者把'$ state.go'中的那个对象作为一个分辨率而不是$ stateParams。 – fodma1

+0

如果你想先解决,然后将其作为$ stateParams在$ state.go中传递,那么你就错过了ui-router的要点。决议是在那里做的。线条变得“太长”似乎更多的是审美方面,而不是功能性编程方面。 – rrd

相关问题