AngularJS:将ui-router $状态数据写入祖先$ state以进行兄弟访问

时间:2014-02-24 20:04:37

标签: angularjs angular-ui-router

我有一个客户管理界面,我正在尝试使用ui-router编写。我将某些州设置为

"csp"
"csp.search"
"csp.customer"
"csp.customer.details"
"csp.customer.status"

如何使用ui-router的{​​{1}} $state获取data结果,并将其提供给csp.search和/或{{的其余部分1}?据我了解,数据需要在最近的共同祖先csp上,但我找不到简单/干净的方法。

我知道我可以将所有内容都设为csp.customer的子状态,以便他们继承csp。我也可以在csp.search之前解析$state.current.data的第一个名字,但这有多普遍?更进一步,我想我可以写一些爬上祖先($state.current.name)的东西,直到找到一些“最顶层”的信号,但我不知道应该是什么。

是否有更优雅的Angular解决方案?

编辑:在给定已知状态的情况下,可能会询问相同的问题,例如: .,如何从任何控制器向其添加数据?

1 个答案:

答案 0 :(得分:1)

您的csp.search结果将在$ scope上。如果其他控制器中的$ scope需要共享该$ scope引用的模型/状态/数据,请通过注册角度服务来使用单例对象实例。可以将一个工厂注入到任意数量的控制器中,然后一切都可以解决这个问题的真相。

下面是一个工厂的简单演示,它使用ui-router http://plnkr.co/edit/P2UudS?p=preview在控制器之间共享一个Object(仅限左侧标签)

工厂&控制器:

app.factory('uiFieldState', function () {
    return {uiObject: {data: null}}
});

app.controller('NavbarCtrl', ['$scope', 'uiFieldState', '$stateParams', '$state',
    function($scope, uiFieldState, $stateParams, $state) {
        $scope.selected = uiFieldState.uiObject;
    }
]);

app.controller('LeftTabACtrl', ['$scope', 'uiFieldState', '$stateParams', '$state',
    function($scope, uiFieldState, $stateParams, $state) {
        $scope.selected2 = uiFieldState.uiObject;
    }
]);

工厂对象{uiObject: {data: null}}通过uiFieldState&注入控制器。然后简单$scope.selected = uiFieldState.uiObject;用于将工厂连接到范围ng-model="selected.data"

这是一个关于angularJS服务的非常好的教程:http://ng-newsletter.com/posts/beginner2expert-services.html