Почему обновление переменной в службе ($ http) не отображается в моем представлении?

Я заблокирован по этой проблеме уже пару часов, поэтому любая помощь очень ценится.

у меня есть контроллер, в котором я определил переменную (пустой массив):

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, потому что я использую $http, который все еще находится в Angular.

@Марк Райкок:

0) Нет, я использую настоящий сервис $http:

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

1) да, я написал в комментарии к коду. data.plot - это то, что я ожидал. Бэкенд-код отлично работает, поэтому я его не публиковал.

2) Я попробую вашу ссылку и дам вам знать.

Между тем любая помощь по-прежнему приветствуется.


person Bruno    schedule 11.03.2013    source источник
comment
Вы пытались применить scope.$digest или scope.$apply после обновления? Я пробежался по коду, но я его не вижу   -  person Dogoku    schedule 12.03.2013
comment
Он использует $http для запроса базы данных - похоже, он использует какую-то функцию async() ?? Кроме того, 1) если вы console.log(data.plot) видите ли вы свои данные? 2) получение области через селектор, а затем вызов scope() не очень угловой. Лучшим способом было бы отправить обещание возврата: см. http-ответ в службе"> stackoverflow.com/questions/12505760/   -  person Mark Rajcok    schedule 12.03.2013
comment
@MarkRajcok и Dogoku - я обновил вопрос ответами на ваши комментарии.   -  person Bruno    schedule 12.03.2013
comment
Если ответ @Flek не решает вашу проблему, возможно, вам нужно использовать angular.copy() вместо присваивания в обратном вызове Success() - см. stackoverflow.com/a/15345762/215945   -  person Mark Rajcok    schedule 12.03.2013
comment
@MarkRajcok спасибо... ссылка, которую вы предлагаете (stackoverflow.com/questions/12505760/) содержит правильный ответ   -  person Bruno    schedule 12.03.2013
comment
@MarkRajcok я отметил ваш комментарий как полезный ... если вы добавите ответ, я приму ваш ответ   -  person Bruno    schedule 12.03.2013


Ответы (2)


Как упоминалось в комментариях, получение области через селектор, а затем вызов области() не очень угловой. Лучшим способом было бы вернуть обещание от службы. У Пита есть хороший пример того, как это сделать: https://stackoverflow.com/a/12513509/215945

angular.copy() следует использовать вместо присваивания в обратном вызове success(), чтобы привязка данных не терялась в контроллере.

См. также https://stackoverflow.com/a/15345762/215945

person Mark Rajcok    schedule 12.03.2013
comment
Я попробовал решение, предложенное в вашем первом комментарии (stackoverflow.com/questions/12505760/)... Я не знаю, будет ли работать и этот. - person Bruno; 12.03.2013

Единственное, что кажется подозрительным, это то, как вы получаете основную область, потому что, когда я пытаюсь вызвать

angular.element('#something');

с AngularJS 1.0.5 или 1.1.3 я получаю следующую ошибку:

селекторы не реализованы

Вы можете увидеть это здесь, когда открываете инструменты разработчика. Это также объясняет, почему свойство вашей области видимости не обновляется.

person F Lekschas    schedule 12.03.2013
comment
Селектор будет работать, если jQuery загружен до Angular. Я предполагал, что @Bruno использует jQuery, но, возможно, это не так. - person Mark Rajcok; 12.03.2013
comment
@MarkRajcok Хорошо, тогда это имело бы смысл. Я не думал об этом. - person F Lekschas; 12.03.2013