14

現在、サーバーをポーリングして新しいデータを確認し、それに応じて AngularJS アプリでモデルを更新しています。彼は大まかに私がやっていることです:

setInterval(function () {
    $http.get('data.json').then(function (result) {
        if (result.data.length > 0) {
          // if data, update model here
        } else {
          // nothing has changed, but AngularJS will still start the digest cycle
        }
    });
}, 5000);

これは問題なく動作しますが、ほとんどのリクエストは新しいデータやデータの変更にはなりませんが、$http サービスは実際には認識もケアもせず、ダイジェスト サイクルをトリガーします。これは不要だと思います (ダイジェスト サイクルはアプリで最も重い操作の 1 つであるため)。$http を引き続き使用できる方法はありますが、何も変更されていない場合、何らかの方法でダイジェストをスキップできますか?

解決策の 1 つは、$http ではなく jQuery を代わりに使用し、$apply を呼び出してモデルが変更されたことを Angular に知らせることです。

setInterval(function () {
    $.get('data.json', function (dataList) {
        if (dataList.length > 0) {
            // if data, update model
            $scope.value = dataList[0].value + ' ' + new Date();

            // notify angular manually that the model has changed.
            $rootScope.$apply();
        }
    });
}, 5000);

これは機能しているように見えますが、良いアイデアかどうかはわかりません。可能であれば、純粋な Angular を引き続き使用したいと思います。

上記のアプローチを改善するための提案や、より洗練されたソリューションを完全に提案した人はいますか?

PS $timeout の代わりに setInterval を使用している理由は、$timeout がこの場合不要なダイジェスト サイクルをトリガーし、「問題」に追加されるだけだからです。

4

3 に答える 3

1

ここでは、Web ソケットが最も洗練されたソリューションのようです。そうすれば、サーバーをポーリングする必要はありません。サーバーは、データや何かが変更されたときにアプリに通知できます。

于 2014-02-21T18:31:41.443 に答える