2016-07-30 5 views
1

を継承していない...

Acess parameters of parent state from child state in stateChangeStart

あなたは$ stateChageStartにtoStateプロパティを注入すると、/マージを継承することになっています親州からのデータ。

残念ながら、これは親が抽象状態の私のアプリでは機能しません。私は私の$ atateChangeStart機能で(toStateプロパティを)CONSOLE.LOG、それはこれを出力し、子ページにアクセスするとここに私のルート

// 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!" 
     } 
    }) 

です。

enter image description here

ですから、親からのデータが存在しないことがわかります。

奇妙なことは、上のスクリーンショットでは、Chrome開発ツールが「V」をデータの隣に置いていることがわかります。通常の「オブジェクト」ではなく、親状態。非常に奇妙な行動。

編集:

私はいくつかの進歩を遂げてきました。 ui-routerのバージョン0.2.11と0.2.18の間には違いがあるようです。このスクリーンショットは2行の出力を示しています。最初のものはバージョン0.2.11で計算された$ stateChageStartの子ルートからのデータです。

ライブラリを0.2.18に切り替えると、代わりに2行目が出力されます。

編集2:

私は私が持っているものを知っている、だから、(変更履歴で破壊変化として分類されていない)、この変更

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"角度フィルタは継承されたプロパティを表示しません。 https://plnkr.co/edit/8ufkoluh1z6qmZT7VySd?p=preview

出典::あなたが戻って古い動作が必要な場合は、あなたにもこれを達成することができます上記plunkr

が得られた実験:

船これら二つの効果を確認するために、この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

関連する問題