2014-06-27 44 views
0

我认为这是可能的,但我可能是错的。从儿童状态,我可以在两个兄弟国家之间分享父母国家的“自定义数据”吗?在兄弟状态之间共享ui路由器'自定义数据'

更新:是的,这是可能的,必须有我自己的代码有问题。这是一个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. 转换到子状态(parent.child1)并更新数组;
  3. 转换到第二个子状态(parent.child2)并仍然可以访问更新数组。

目前,我可以查看和更改内部parent.child1阵列,但是当我立即转换到parent.child2,自定义数据,$state.current.data.sharedArray,是空的。

回答

1

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

如果你的流量是父 - > child1 - > child12真正的角流父 - > child1,父 - > child12,所以在child12总是[]

+0

我的设置有些不对,即使作为孩子的孩子 - 和嵌套的意见,所以我可以看到原始视图 - 我仍然看到一个空的'sharedArray'。在过渡之前,它已经完全填充,并且在过渡之后它是空的。我会看看我能不能在PLUNK上做出一些事情。 – Andrew

+0

是的。我的实施必须有问题。这里是一个[working plunker sample](http://plnkr.co/edit/fy61hGJILvYYu84urokK) – Andrew

1

我要离开这个问题的回答sharedArray通过@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); 

这是非常快速和直接,但它是相当不雅莫测,所以如果你希望知道是怎么回事,这需要一些文件这里。是的,迭代你的新数组并逐个添加元素可能会更简单,但是如果你的数组非常大,那么这最终肯定会慢得多。

相关问题