バインディング値に依存する子コンポーネントで初期化を実行して初期化を完了する前に、コンポーネント バインディングが親スコープで安定するのを待つ良い方法を見つけるのに苦労しています。
これが私のフィドルです: https://jsfiddle.net/nLpd9bsq/2/
可能な解決策:
1. $onChanges() を使用して、すべてのバインディングが安定するのを待ちます
。この例ではバインディングは 1 つしかありませんが、3 つのバインディングを持つコンポーネントがあり、各値が親スコープで非同期に読み込まれるとします。promise のようなものを使用せずに子スコープの初期化を同期しようとすると、混乱が生じます。
2. 「非同期値」
の初期化をサービスに移動 初期化をサービスに移動し、Promise を使用してそれを解決し、このサービスを大文字と小文字の両方のコンポーネントに挿入します。これを行うと、コンポーネント バインディング メカニズムをあきらめるという事実に加えて、appController での初期化を制御できなくなり、両方のコンポーネントが同じ Async 要求を行うのを防ぐためにサービスに追加のコードが必要になります。独自の初期化サイクル中に発生し、非同期リクエストが重複して終了します。
あなたの考えは何ですか?どのソリューションを使用しますか? ありがとう!
app.js
angular.module('app', [ ]);
angular
.module('app')
.controller('appController',function($scope, $timeout){
var $ctrl = this;
$timeout(function(){
$ctrl.value = 'Async value'
}, 1000);
})
.component('uppercase', {
bindings : {
stringVal : '<'
},
controller: function($scope){
this.$onChanges = function(obj){
/* Needed to wait initialization on the parent */
if(obj.stringVal.currentValue){
this.upperVal = this.stringVal.toUpperCase();
}
};
},
template : '<div>Uppercase value: {{$ctrl.upperVal}}</div>'
})
.component('lowercase', {
bindings : {
stringVal : '<'
},
controller: function($scope){
this.$onChanges = function(obj){
/* Needed to wait initialization on the parent */
if(obj.stringVal.currentValue){
this.upperVal = this.stringVal.toLowerCase();
}
};
},
template :'<div>Lowercase value: {{$ctrl.upperVal}}</div>'
});
app.html
<div ng-app="app" ng-controller="appController as $ctrl">
<uppercase data-string-val="$ctrl.value"></uppercase>
<lowercase data-string-val="$ctrl.value"></lowercase>
</div>