我认为这是可能的,但我可能错了。从子状态,我可以在两个兄弟状态之间共享父状态的“自定义数据”吗?
更新:是的,有可能,我自己的代码一定有问题。这是一个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 '[]'
})
基本上,我想:
parent
); parent.child1
)并更新数组; parent.child2
)并仍然可以访问更新数组。目前,我可以在parent.child1
内查看和更改数组,但是当我立即转换到parent.child2
时,自定义数据$state.current.data.sharedArray
为空。
答案 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);
这是非常快速和直接的,但它非常不优雅且不可思议,所以如果你希望知道这里发生了什么,它需要一些文档。是的,迭代你的新数组并逐个添加元素可能更简单,但是如果你的数组非常大,那么这几乎肯定会更快,更慢。