2016-04-19 15 views
1

$ scope.emit(...)の呼び出しが処理を完了した後に(つまり、すべてのハンドラ/リスナーが完了した)アクションを実行する必要があります。

    $scope.$emit("nsError:setPage", { page: page, ele: ele });// tell page directive to set the current page so that the errored item is visible 
        alert('here'); 

現在のところ、UIが正しいページに更新される前にアラートが発生します。

+0

おかげで、それは、放出されたイベント(ではない、その後、私が述べたように)を消費するためです。 – Nathan

答えて

1

$scope.$emitが完了しました」というのは、「UIが更新されました」と同じではありません。 UIを更新するには、ダイジェストサイクルを完了する必要があります。これはの角度$timeout機能を使用することにより発生するためにあなたは待つことができます(コントローラでそれを注入することを忘れないでください):

$timeout(function(){alert('here');}); 
+0

ありがとう、それはトリックでした。そのようなことを処理する "正しい"方法ですか? (ダイジェストサイクルが何らかの理由で長い時間がかかった場合、タイムアウトの原因となるタイミング問題を使用する可能性があります)。 – Nathan

+1

いいえ、タイムアウトは発生しません。 $ timeoutはAngularによって提供されるサービスです。 $ digestをラップする$ applyをラップします。基本的に、fikkatraが提供するコードは、Angularがあなたのコードを一度準備しておくことを保証します。私はここでそれを説明しようとしました:http://stackoverflow.com/a/33364954/741802 –

+1

私たちはここで遅延を渡していません、我々はただ0のデフォルトの遅延を使用しています。直ちに処理するのではなく、実行キューの最後にアラートを追加します。これにより、ブラウザーはDOMの更新のような他のものを実行する時間を与えます。これが正しい解決策であることに疑問を持っているのは正しいです。面白いにおいはしません。これを処理する良い方法であるかどうかは、具体的なケースによって異なりますが、DOMが更新された後にコードを実行するだけで済む場合もあります。 – fikkatra

0

あなたがイベント発する場合:

$scope.$emit("nsError:setPage", { page: page, ele: ele }) 

あなたは、その後に耳を傾けるでしたそれ:

$scope.$on('nsError:setPage', function(event, mass) { alert('here'); }); 

$emitが下方にあなたの子供SCOPにスコープの階層と$broadcast派遣を通って上方イベントを送出していることに注意してくださいes。公式doc

詳細情報(上の$までスクロール)ルックGuyTを持つため

+0

あなたの答えをありがとう、上記GuyTのコメントを参照してください - あなたの答えにもあてはまると思います。 – Nathan

+0

あなたの質問が間違っているようです。 –

+0

心配はありません。あなたはfikkatraの答えを説明したリンクをたどって、その答えを+1しました。 :) – Nathan

関連する問題