AngularJS:用工厂控制服务数据

时间:2013-08-29 16:31:49

标签: angularjs angular-services angularjs-factory

我试图从两个独立的控制器“控制”工厂中的数据,而下面的代码工作正常,但并不总是有效。无论出于何种原因,它只会在50%的时间内绑定数据。有没有办法确保数据始终被绑定,如果任一控制器对数据进行编辑,则更改将反映在两端。

服务:

angular.module('service', ['ngResource']).
    factory('Service', function($resource){
        return $resource('/api/data/:id', {id:'@id'}, {});
});

厂:

angular.module('factory', ['ngResource', 'service']).
    factory('Factory', function($resource, Service) {
        this.mydata = '';
        return {
            getData: function(id){
            return Service.query({id: id});
            },

            data: function(data){
            return this.mydata;
            },

            setData: function(data){
            this.mydata = data;
            }
        }
});

控制器:

$scope.Factory = Factory;
var items = Factory.getData(0);

items.$promise.then(function(itemArr){

    var item = itemArr[0];
    $scope.data = item;

    Factory.setData(item);
});

如果有更好的方法可以做到这一点,那么我就不必在工厂设置好的数据。不必处理控制器中的promise对象也不错,但我认为不可能在工厂中获取数据。

使用上述工厂设置数据后,我使用以下代码在不同的控制器中访问它:

    var item = Factory.data();
    $scope.selected = [{foo:'bar'},{foo1:'bar1'}];

    angular.forEach($scope.selected, function(value, key){
        item.requirements.push(value);
    })

    Factory.setData(item);

最终,我希望能够从两个控制器访问相同的更改数据。上面的工作,但只有一些时间,我不知道什么是没有设置。

编辑: 通过在回调函数上使用控制器中的$scope.$watch功能,我能够始终使其工作。数据是绑定的,但角度需要知道要注意的内容,如下面的答案所示。

1 个答案:

答案 0 :(得分:0)

为了不必在'factory'(也就是角度服务)中手动设置数据,你可以在回调资源时设置它:

 return {
            getData: function(id){
              return Service.query({id: id}, function(data){
                myData = data;
              });
            },

如果你不想处理promise对象,你可以将自己的回调发送到getData函数,当它完成时,调用你在资源回调中发送的回调:

 return {
                getData: function(id, cb){
                  return Service.query({id: id}, function(data){
                    myData = data;
                    if (cb) {cb(data);}
                  });
                },

这改变了你将getData调用的方式:

var items = Factory.getData(0, function(itemArr){
    var item = itemArr[0];
    $scope.data = item;
});