これは、以前のAngularJSの質問のフォローアップです。
このビデオチュートリアルで言及されている$resourceサービスの機能を複製しようとしています:link。
このチュートリアルでは、非同期呼び出しを使用してスコープ変数とそのビューを更新できることを示しています。まず、設定されているリソースは次のとおりです。
$scope.twitter = $resource('http://twitter.com/:action',
{action: 'search.json', q: 'angularjs', callback: 'JSON_CALLBACK'},
{get: {method: 'JSONP'}});
次に、get
関数がリソースで呼び出され、ajax呼び出しが行われ、必要なスコープ変数が更新されます。
$scope.twitterResult = $scope.twitter.get();
ここで起こっていること$scope.twitter.get()
は、空のオブジェクト参照をすぐに返すことです。次に、ajaxリクエストが返されると、そのオブジェクトはTwitterからのデータで更新されます。次に、ビューはすべての{{twitterResult}}インスタンスを更新し、返されたデータが表示されます。
オブジェクトが非同期コールバックで更新されたときに、スコープは値が変更されたことをどのように認識しますか?
私はそうは思いません-コールバックはスコープである種の更新関数を呼び出さなければなりませんよね?しかし、もしそうなら、これはどのように行われますか?$apply
それが答えかもしれないという関数を聞いたことがありますが、リソース内から$scope。$apply()をどのように参照しますか?
問題を説明するためにJSFiddleを作成しました:http://jsfiddle.net/Qcz5Y/10/
(編集:これは、setTimeoutの代わりにajax呼び出しを使用して問題を説明するために、異なる非同期呼び出しを備えた新しいJSFiddleです:http://jsfiddle.net/Qcz5Y/14/)
この例では、コントローラーとリソースが表示されます。コントローラのスコープにはfruit
、オブジェクトに設定された状態から始まるプロパティ、があります。[新しいフルーツを取得]をクリックすると、そのプロパティはに設定されfruitResource.get()
、すぐに空のオブジェクトが返されます。次に、非同期呼び出しを行い、最後に、最初に返されたオブジェクトの値を更新するコールバックを実行します。
これが発生すると、の値が$scope.fruit
コールバックで設定された値に適切に更新されます。しかし、それはビューに反映されていません。
[現在の果物を印刷]をクリックすると、現在の値がコンソールに記録されます$scope.fruit
。これは確認のためだけのものでした。ビューを更新するという副作用があります。
関数の下部で$scope。$apply()のようなことをする必要があるように感じます(get_callback
コードに表示されます)。それは正しいことでしょうか?もしそうなら、どのように私はfruitResource内の$ scopeへの参照を取得しますか?おそらくパラメーターとして渡してその方法で参照できることはわかって$scope
いfruitResource.get()
ますが、上部にある例の$ resource.get()関数はこれを行う必要がないため、AngularJSが何らかの方法を提供することを期待していました。サービスからスコープを自動的に取得します。
ありがとう!