から来ている機能である二つの機能
$scope.isCheckedIn = function() {
console.log($scope.users_events);
//more code
}
$scope.checkIn = function() {
console.log($scope.users_events);
//more code
}
ありますボタンをクリックすると、checkIn
関数が呼び出されています。
dataService.getCollectionForId('events', id, 'users')
はPromise
を返すために起こっています。 then
に渡された最初の関数は、Promise
が正常に解決された後に実行されます。
この実行は、ビューが初期化された後に発生する可能性があります。そのため、checkedIn
が機能しますが、isCheckedIn
は機能しません。
は「解決」するために、これは、あなたは必ずデータを取得する(代わりのダイジェストサイクルに依存する)後の計算式を再評価させることができ、またはより一般的には、いつでも入力のいずれかが変更されました。私はisCheckedIn
が他の有用な初期化を行っていると仮定しています。その場合は、最後にthen
関数内で呼び出す必要があります。
通常、{{ $scopeExpression }}
のような指示またはビューバインドを使用して、$scope
の値を表示します。変更すると最新の状態になります。計算に時間がかかり、サービスへの呼び出し)、ダイジェストサイクルを迅速かつアプリケーションの応答性を保つために何か他の処理を行う必要があります。
たとえば、一般的な問題の一般的な解決方法があります。入力のいずれかが変更されたときはいつでも、さまざまな入力ソースから再計算する必要のある計算のセットがあれば、入力が比較的小さいと仮定するとないアレイ(あなたはちょうどあなたが「平等」をどう定義するかについて注意する必要があり)とあなただけの(1)を見ると、これを行うことができます(数字または短い文字列など):あなたがいない
$scope.$watch(function() {
return {
input1: expression1,
input2: expression2,
// ...
}
}, function (value) {
// This function will only execute if at least one of the inputs changed
var computations = [];
computations.push(computationA(value.input1, value.input2 /* ,.. */));
computations.push(computationB(value.input1, value.input2 /* ,.. */));
computations.push(computationC(value.input1, value.input2 /* ,.. */));
// ...
$q.all(promises).then(function (computations) {
$scope.computationAResult = computations[0];
$scope.computationBResult = computations[1];
$scope.computationCResult = computations[2];
// Do synchronous work here on inputs so that all $scope variables get updated at once.
});
}, true /* Deep watch */);
この方法各ダイジェストサイクルで高価な計算をたくさん行う。
まだ回答がありませんでした。 http://blog.slaks.net/2015-01-04/async-method-patterns/ – SLaks
大丈夫です。どうすれば修正できますか? –
あなたのやりたいことによって異なります。これは初期に宣言された関数のために予想される動作である、AJAX要求はまだ解決されません。あなたは、応答が来るとすぐにデータを使用したい場合は、.then(機能)の内部でそれを行う必要があります。もう一つの方法は、コントローラで$ウォッチャーを追加することで、$約束関数内適用されます。 – caiohamamura