在AngularJS控制器中直接绑定到服务是一种好习惯吗?

时间:2013-10-08 07:47:37

标签: angularjs data-binding

直接绑定到Angularjs中的服务有什么问题,比如这个吗?

控制器:

function MyCtrl(myService) {
    $scope.myService = myService;
}

查看:

<button ng-click="myService.doSomething()"></button>

或者最好直接在控制器中声明视图中使用的方法和变量吗?

控制器:

function MyCtrl(myService) {
    $scope.doSomething = myService.doSomething;
}

查看:

<button ng-click="doSomething()"></button>

1 个答案:

答案 0 :(得分:1)

为什么不呢。是的好习惯。服务的目标是避免代码重复。它就像Utils。

如果我们的项目包含多个控制器,我们可以轻松地将服务注册到每个控制器并使用存储在服务中的所有方法。

顺便说一下,它的良好做法也是在不同文件中定义服务,以便您可以将服务迁移到其他项目。

此外,您可以在一个服务中对多个服务进行分组。这是例子:

myModule.factory('ajax_post', ['$http',
        function(_http) {

    var path = 'src/php/data.ajax.php';

    return{
        init: function(jsonData){
            var _promise= _http.post(path, 
                jsonData
                ,{
                    headers: {
                        'SOAPActions': 'http://schemas.microsoft.com/sharepoint/soap/UpdateListItems'
                    }
                }
                );            
            return _promise; 
        },       
        uploadFile_init: function(uploadedFile){
            var fd = new FormData();
            fd.append("uploadedFile", uploadedFile);
            var upload_promise =  _http.post("src/php/data.ajax.php",
                fd,
                {
                    headers:{
                        'Content-Type':undefined
                    },
                    transformRequest:angular.identity
                });

            return upload_promise;
        },
        uploadFile_init_for_compare: function(uploadedFile){
            var fd = new FormData();
            fd.append("uploadedFileForCompare", uploadedFile);
            var upload_promise =  _http.post("src/php/data.ajax.php",
                fd,
                {
                    headers:{
                        'Content-Type':undefined
                    },
                    transformRequest:angular.identity
                });

            return upload_promise;
        }     
    }   
}]);

上述服务包含3个子服务:

  • 初始化
  • uploadFile_init_for_compare
  • uploadFile_init

您可以从控制器调用子服务,如:

ajax_post.init(/**/);
ajax_post.uploadFile_init_for_compare(/**/);
ajax_post.uploadFile_init(/**/);