共享ui-router'自定义数据'兄弟姐妹之间

时间:2014-06-27 15:28:45

标签: angularjs inheritance angular-ui-router

我认为这是可能的,但我可能错了。从子状态,我可以在两个兄弟状态之间共享父状态的“自定义数据”吗?

更新:是的,有可能,我自己的代码一定有问题。这是一个simplified example on plunker。由于历史原因,我的其余问题在下面继续。请注意,我的原始代码示例的拼写错误为chidl2而不是child2,这就是@originof在答案中使用它的原因。

这是我想要做的简化示例。

app.config(function ($stateProvider) {
    $stateProvider
    .state('parent', {
        abstract: true,
        template: '<div ui-view></div>'
        data: {
            sharedArray: []
        }
    })
    .state('parent.child1', {
        url: '/child1',
        controller: 'Child1Ctrl',
        templateUrl: 'js/lib/parent/child1.tpl.html',
    })
    .state('parent.child2', {
        url: '/child2/:id',
        controller: 'Child2Ctrl',
        templateUrl: 'js/lib/records/parentitem.tpl.html'
    });
});
app.controller('Child1Ctrl', function ($state) {
    // This is always loaded first
    $state.current.data.sharedArray.push("child 1 adding data data");
});
app.controller('Child2Ctrl', function ($state) {
    // This is always loaded from a Child1Ctrl
    console.log($state.current.data.sharedArray); // Says '[]'
})

基本上,我想:

  1. 在父级抽象状态(parent);
  2. 中设置数组
  3. 转换到子状态(parent.child1)并更新数组;
  4. 转换到第二个子状态(parent.child2)并仍然可以访问更新数组。
  5. 目前,我可以在parent.child1内查看和更改数组,但是当我立即转换到parent.child2时,自定义数据$state.current.data.sharedArray为空。

2 个答案:

答案 0 :(得分:1)

可能你必须将parent.child12修改为parent.child1.child12。

如果您的流量是父级 - > child1 - &gt; child12真正的角流是父 - &gt; child1,parent - &gt; child12,所以在child12中,sharedArray总是[]

答案 1 :(得分:1)

我正在离开这个问题,正如@originof所回答的那样,但我找到了我的问题的真正来源,它与UI-Router无关,至少不是直接的。

如果你试图在兄弟状态之间共享一个数组,你必须非常小心,如果你期望它能够存活,只改变数组 - 如果你使用它将用本地数组覆盖父(原型)数组作业(即不写$state.current.data.sharedArray = [1, 2, 3])。

执行此操作(更改数组)可能会有点挑战,具体取决于您正在执行的操作,因为push()splice()等函数不能用于非常轻松地合并数组(您基本上必须使用在函数调用中序列化你的数组),而concat()之类的函数需要重新分配(因为它返回一个新数组)。

以下是我可能要做的事情:

// First, empty the shared array
$state.current.data.sharedArray.splice(0, $state.current.data.sharedArray.length); 

// Next, merge the new array
Array.prototype.push.apply($state.current.data.sharedArray, newArrayData);

这是非常快速和直接的,但它非常不优雅且不可思议,所以如果你希望知道这里发生了什么,它需要一些文档。是的,迭代你的新数组并逐个添加元素可能更简单,但是如果你的数组非常大,那么这几乎肯定会更快,更慢。