0

私はこの問題で数時間ブロックされているので、どんな助けも大歓迎です.

私は変数(空の配列)を定義したコントローラーを持っています:

function MainCtrl(scope, graph) {
    scope.myVar = [];   
    graph.send("a", "b");
}
MainCtrl.$inject = ['$scope',  'plotData'];

plotData私が書いたカスタムサービスです。$httpデータベースにクエリを実行し、必要なデータを取得するために使用します。

angular.module('myApp.services', []).
factory('plotData', ['$http', function(async) {

    var mainScope = angular.element("#main").scope();

    return {
        send: function(plotType, plotDetail) {
            var thisObj = this;

            var ajaxConfiguration = {
                method: 'POST',
                url: '******************',
                data: { 
                    type: plotType,
                    detail: plotDetail
                }
            };

            async(ajaxConfiguration).
                success(function(data, status, headers, config) {                   
                    mainScope.myVar = data.plot;
                    /* 
                        data.plot is what i expected! 
                        I also try with: return data.plot;
                    */

                }).
                error(function(data, status, headers, config) { 
                    console.info("error"); 
                });
        },
        doSomething: function(data) { },
        doSomethingElse: function() { }
    };

}]);

問題は、コントローラーでscope.myVar変更されないことです。基本的に私がやろうとしているのは、コントローラーで定義された変数をディレクティブから更新することです。

私が間違っていることは何ですか?

アップデート:

@dogoku : 私が知っているように、$apply を使用する必要はありません。なぜなら、まだ Angular にある $http を使用しているためです。

@マーク・ライコック

0) いいえ、私は実際の $http サービスを使用しています:

factory('plotData', ['$http', function(async) { 
    /* service */ 
}]);

1) はい、コードのコメントに書きました。data.plot は、私が期待していたものです。バックエンド コードはうまく機能するので、投稿していません。

2) リンクを試してお知らせします。

その間、どんな助けも大歓迎です。

4

2 に答える 2

1

コメントで述べたように、セレクターを介してスコープを取得してから scope() を呼び出すことは、あまりAngularではありません。より良い方法は、サービスから promise を返すことです。ピートには、これを行う方法の良い例があります: https://stackoverflow.com/a/12513509/215945

angular.copy()コントローラーでデータバインディングが失われないように、success() コールバックで割り当ての代わりに使用する必要があります。

https://stackoverflow.com/a/15345762/215945も参照してください

于 2013-03-12T17:59:04.400 に答える
0

疑わしいと思われる唯一のことは、メインスコープを取得する方法です。

angular.element('#something');

AngularJS 1.0.5 または 1.1.3 では、次のエラーが発生します。

セレクターは実装されていません

開発者ツールを開くと、ここで確認できます。これは、スコープのプロパティが更新されない理由も説明します。

于 2013-03-12T12:52:11.590 に答える