2016-04-06 5 views
0

isCheckedInビューが初期化され、ボタンがクリックされたときにチェックイン機能が呼び出されているときに関数が呼び出されています。

私がなぜわからないけど$ scope.users_eventsはisCheckedInで未定義が、私は間違って何をやっているcheckIn

に値を持っているのですか?

これらこれは、変数は、ビューが初期化されるときisCheckedIn関数が呼び出されている

function getCheckedInUsers(){ 
    dataService.getCollectionForId('events', id, 'users') 
    .then(function(response) { 
     $scope.users = response.data.relatedObjects.users; 
     $scope.users_events = response.data.data; 
    }); 
} 

getCheckedInUsers(); 
+3

まだ回答がありませんでした。 http://blog.slaks.net/2015-01-04/async-method-patterns/ – SLaks

+0

大丈夫です。どうすれば修正できますか? –

+1

あなたのやりたいことによって異なります。これは初期に宣言された関数のために予想される動作である、AJAX要求はまだ解決されません。あなたは、応答が来るとすぐにデータを使用したい場合は、.then(機能)の内部でそれを行う必要があります。もう一つの方法は、コントローラで$ウォッチャーを追加することで、$約束関数内適用されます。 – caiohamamura

答えて

0

から来ている機能である二つの機能

$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 */); 

この方法各ダイジェストサイクルで高価な計算をたくさん行う。

関連する問題