2016-07-30 178 views
1

抽象状态不是继承的数据根据​​上面这个问题的答案...孩子

Acess parameters of parent state from child state in stateChangeStart

当你注入到使用toState $ stateChageStart它应该继承/合并来自父母国家的数据。

不幸的是,这不是在我的应用程序父母是抽象状态的工作。这里是我的路线

// Settings 
    .state('wfSettings', { 
     url: '/settings', 
     abstract: true, 
     template: '<ui-view/>', 
     data:{ 
      customData1: "Hello", 
      customData2: "World!" 
     } 
    }) 


    .state('wfSettings.siteSettings', { 
     url: "/site-settings", 
     templateUrl: "/templates/siteSettings.tpl.html", 
     controller: "SiteSettingsCtrl as siteSettings", 
     data:{ 
      customData2: "UI-Router!" 
     } 
    }) 

当我在$ atateChangeStart功能CONSOLE.LOG(使用toState)和访问它输出该子页面。

enter image description here

所以你可以看到,从父数据是不存在的。

唯一奇怪的是,在上面的屏幕截图中,您可以看到Chrome开发工具已将数据旁边的“V”放在数据旁边,而不是通常的“对象”,如果我没有在数据上放置任何数据父母国家。非常奇怪的行为。

编辑:

我已经取得了一些进展。 ui路由器的版本0.2.11和0.2.18似乎有所不同。该屏幕截图显示了两行输出。第一个是根据版本0.2.11计算的$ stateChageStart中子路由的数据。

当我将库切换到0.2.18时,它会输出第二行!

编辑2:

我跟踪它到这种变化(没有归类为changelog的重大更改)

https://github.com/angular-ui/ui-router/commit/c4fec8c7998113902af4152d716c42dada6eb465

于是,我知道了什么导致它,但我仍然不知道如何解决这个问题。据推测,我需要以某种方式去原型链手动合并这些值?这有点超出了我对JavaScript原型继承的知识。

回答

1

这是由于0.2.16中的突变所致。这些属性仍然可以通过子状态访问,但需要直接访问。

在0.2.15和之前,从父状态的数据属性对象 被复制到子状态的数据对象是 注册时的状态。如果父状态的数据对象在运行时发生更改,那么 子级不会改变这些更改。

在0.2.16+中,我们切换到原型继承。父数据对象的更改会反映在孩子身上。

来源:https://ui-router.github.io/guide/ng1/migrate-to-1_0#prototypal-inherited-data

什么都不用然而提到是,即使在前面的例子仍然有效(customData1可在公子状态),如果枚举$继承的属性将不会出现在state.current.data.property - 例如“json”角度过滤器不会显示继承的属性。看看这个plunkr看到这两种效应:https://plnkr.co/edit/8ufkoluh1z6qmZT7VySd?p=preview

来源:导致上述plunkr实验

如果你想在旧的行为后面,你可以做到这一点还有:

船已经开始复制和原型继承之间的决定。切换到深度复制对许多应用程序来说都是一个突破性变化,它们期望子状态的数据属性可以打破父状态的数据属性。

如果你想非标准(深层副本)的行为,你可以肯定 实现它为您的应用程序:

$stateProvider.decorator('data', function(state, parentDecoratorFn){ 
    var parentData = state.parent && state.parent.data || {}; 
    var selfData = state.self.data || {}; 
    return state.self.data = angular.merge({}, parentData, selfData); 
}); 

例如:http://plnkr.co/edit/Wm9p13QRkxCjRKOwVvbQ?p=preview

来源:https://github.com/angular-ui/ui-router/issues/3045#issuecomment-249991317