2016-07-07 9 views
4

AngularJS 1.5より前のバージョンでは、ディレクティブまたはビューで、サードパーティの非同期コールバックから変更が発行されたときに変更が$ digestサイクルを使用して取得されることを確認する方法あなたのコードを$scope.$apply()呼び出しで実行することでした。AngularJS 1.5のサードパーティの非同期コールバックコンポーネント

私が理解する限り、考えは$scopeを取り除き、テンプレートをコンポーネントのコントローラにバインドすることです。私は、$ scopeに頼ることなく、ビューの代わりにコンポーネントを書くことに移行しようとしています。のは、私は次のコードを持っているとしましょう:。

function CompController(TPApi) { 
    let self = this; 
    this.endCallback = false; 
    TPApi.call(data,() => this.endCallback = true); 
} 

angular.module('app', []).component('myComp', { 
    controller: CompController, 
    template: '<div><span ng-show="$ctrl.endCallback">Callback Called</span></div>' 
}) 

ここでの問題はなく、$スコープを使用せずに、ng-showがコントローラにダブルバインドされていることである$は、(適用)コールバックのため、変更が拾われることはありません$ digestサイクルがトリガーされないので、ng-showによって実行されます。これはコントローラに$ scopeを挿入して$ applyを呼び出さなければならないので、非常に煩わしいことですが、最初は$ scopeに頼るという目的を破ります。

$qサービスでTPApiをカプセル化し、コールバックが発行されたときに$ digestサイクルが呼び出されるようにする方法があると思います。しかし、ある時点で$qの代わりに新しいネイティブのPromise APIを使用するように移行したいのであればどうしたらよいでしょうか?

$ digestをトリガーすることなくこれを行うにはスマートな方法がありますか?または、$ scopeと$ digestのために角度1に本質的に欠陥がありますか?

+0

この動作はフィドルで再現できますか?あなたの例は正常に動作し、モデルはAPIコールの後に更新されます。 – gyc

+0

ここに行く:https://jsfiddle.net/xgcphw0m/4/使用されたジオロケーション。 $ qまたは$ httpのような角度サービスを使用していれば、それは動作しますが、$ applyでコールバックをラップするためです。それは私が避けたいものです。 –

+0

残念ながら、私はes6についてよく分かりません。 – gyc

答えて

0

サードパーティのAPIを呼び出しているので、到着した新しいデータを更新して認識するためには、角度を使用する必要があります。 $ scopeを使用したくない場合は、$ timeout(あなたのダイジェストサイクルをトリガーするコード)をラップすることができます。

function CompController(TPApi) { 
    let self = this; 
    this.endCallback = false; 
    TPApi.call(data,() => $timeout(() => this.endCallback = true, 0)); 
} 
関連する問題