AngularJS服务与Controller共享数据的问题

时间:2016-11-17 19:49:09

标签: angularjs

我有以下服务为我成功连接到php文件并从数据库中获取数据:

(function(){
    'use strict';
    angular.module('app.services')
        .factory('myService', [ 'getContent', function(getContent, $resource, $scope) {


            return {
                //list of things returned by this service:

                getEventTypes: function(dir, file) {
                    var getAllTypes = getContent.getphp(dir, file);

                    getAllTypes.query(function(data){

                        $scope.mytypes = data;

                    });
                }
            };

        }])
    ;

})();

但我无法通过它为任何变量分配数据。事实上,$ scope.mytypes给了我一个“无法设置未定义的属性'etypes”......我不确定发生了什么?如果我删除$ resource和$ scope然后它不起作用,因为我将另一个服务注入此服务...... Blegh。建议?

2 个答案:

答案 0 :(得分:1)

不要在服务中使用$ scope,这是不可取的。

  由于Angulajs是一个MVC框架,M模型之间应该绑定   V-view和C-controller这里的$ scope是模型 -   将视图连接到控制器的实体。

因此,我们不应该在服务中使用它,并且不会按预期工作。

我们通常每个视图使用一个控制器,如果我们有任何通用逻辑应该在多个控制器中重用,如通用验证,API调用等,它应该在服务中使用。这就是为什么Service被构建为单例对象的原因,这意味着只有一个实例将在SPA(单页面应用程序)中创建并在多个控制器之间共享。但是应该为每个视图创建唯一的控制器和$ scope。

希望你明白这一点。因此,您的上述服务可以修改如下,以返回API调用的承诺,您可以在控制器内部使用相同的调用并将对象分配给$ scope。

<强>服务

return {
                //list of things returned by this service:

                getEventTypes: function(dir, file) {
                    var getAllTypes = getContent.getphp(dir, file);

                    return getAllTypes;
                }
            };

<强>控制器

myService.getEventTypes(/* params */).query(function(data) { $scope.myTypes = data; });

答案 1 :(得分:1)

这是另一种方法,您可以让服务为您完成所有工作,减少控制器中的代码行。

(function(){
    'use strict';
    angular.module('app.services')
        .factory('myService', [ 'getContent', function(getContent, $resource, $scope) {

            return {
                //list of things returned by this service: 
                getEventTypes: function(dir, file,successcallback) {
                      getContent.getphp(dir, file)
                      .query()
                             .success(function (data, status, headers, config) {
                                successcallback(data);
                              })
                            .error(function (data, status, headers, config) {
                                $log.warn(data, status, headers, config);
                            })
                }
            };
        }]);
})();

分配到范围对象将是这样的

myService.getEventTypes(/*you params comma separate if needed*/,function(successcall){
$scope.data=successcall;
});