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。更好的方法是从服务中返回一个承诺。皮特在这里有一个很好的例子来说明如何做到这一点: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 回答