2016-03-28 4 views
1

私はangularJsの初心者で、私の考えでは、私の$scopeの変化を揺らすことで簡単な問題があります。自動腕時計を有効にするにはどうすればいいですか?

私はサーバーから受け取ったオブジェクト$scope.tasksを持っています。それは次のようになります。

{ 
2: {id: 2, name: 'name1', user: 3}, 
3: {id: 3, name: 'name2', user: 1}, 
4: {id: 4, name: 'name3', user: 4}, 
} 

また私はタスクで更新ユーザー機能を持っている:

$scope.managePlannedIterationTask = function(taskId, userId) { 
    var data = { 
     'taskId' : taskId, 
     'userId' : userId 
    }; 
    $http.post("url", data).success(function(data, status) { 
     $scope.tasks[taskId].user = userId; //#1 
    }); 
}; 

また、私はカスタム関数$scope.test(); にこの機能を持って作業中のユーザのすべての変更後に実行する必要があり、例えば//#1

で更新クエリと更新した後、私は、この目標の$時計と$ watchCollectionのために使用しようとした:

$scope.$watchCollection('tasks', function() { 
    $scope.test(); 
}) 

しかし、これは役に立ちません。そして今、私が$ scope.tasksを更新するときには、すべての場所に$scope.test()を挿入する必要があります。とても悲しい。 どうすれば自動的に行うことができますか?

+1

いつ時計を登録し、どのように変更をトリガーしていますか? –

+0

@DavidLコントローラの最後にウォッチを登録し、selectのng-changeでトリガを変更します。 – Neversmile

+0

それはあなたの問題です。最初に登録してください。あなたが最後にそれを登録した場合、それが見ていた相互作用が既に終わるまで登録されない可能性があります。最後に、これはデザインの匂いを示すかもしれません。代わりに、コールバックスタイルのアプローチを検討することもできます。 –

答えて

1

腕時計を使用することは、コードで使用することをお勧めしません。私はあなたがupdateコールが成功したときtestメソッドへの呼び出しを持っていると思います。

そしてpostコールのsuccessコールバックの内側には、サーバーのデータと同期して正しくviewデータを作るためにtasksリストを更新取得するために別の呼び出しを行いません。現在、特定のレコードに対してクライアント側のデータを更新していますが、これは複数のユーザーが広く使用しているデータ中心のアプリケーションでは意味をなさないものです。このアプリケーションにアクセスしているユーザーが1000人で、レコードを更新している場合、他のユーザーも同じページの任意のレコードがupdated/addedです。したがって、アプリケーション内で不整合な振る舞いが追加されます。だから私はあなたのアプリケーションを一貫性と正確性を保つためにデータ&をフェッチするためにもう一度もう一度ajaxを作ることを提案しています。もう一度ajaxを呼び出すと100msを受け取ることはできませんが、これは正当な理由でより安価に支払われます。あなたはウォッチャーとディレクティブを書いて、あなたが見ることにしたいモデルに置くことができる

コード

$scope.managePlannedIterationTask = function(taskId, userId) { 
    var data = { 
     'taskId' : taskId, 
     'userId' : userId 
    }; 
    $http.post("url", data).then(function(response) { 
     var data = response.data; 
     $scope.getTasks(); 
     $scope.test(); 
    }); 
}; 

$scope.getTasks = function(){ 
    $http.get('getTasksUrl').then(function(response){ 
     $scope.tasks = response.data; 
    }); 
} 
+0

$ watchを使用するとパフォーマンスの問題や何らかの悪い習慣につながることは知っていますが、なぜそれが「悪い習慣」だと言いますか?私はそれが常に悪い練習だとは思わない –

+0

@PankajParkarはい、私はあなたに同意します。私は、私のコードを模式的かつ非常にシンプルに表示します私は '$ scope.tasks [taskId] .user = userId;'でタスクを更新しています。あなたの例では、私は仕事で1人のユーザしか変更しないと、すべての仕事をもう一度やりたいと思っていません。私はそれが正当化されていないと思う。 – Neversmile

+0

@ Gonzalo.-あなたは、ウォッチャーが各ダイジェストサイクルでその表現を見ていることを知っているので、あなたは 'deep'ウォッチャーを持つ大きなコレクションオブジェクトを持っていると仮定すると、あなたのアプリケーションのパフォーマンス..したがって、アプリケーションの設計中にウォッチャーの使用を避けるようにしてください..個人的に私はその方法をお勧めします.. –

0

。しかし、あなたが正しく理解していれば、ポストリクエストが成功した後にページのデータを更新する必要があります。ポスト要求を出したり、ポストが成功したり、悪い場合にはルートを使用したり、 。

関連する問題