2016-07-30 181 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