Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/angularjs/23.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
AngularJS:使用工厂控制服务数据_Angularjs_Angular Services_Angularjs Factory - Fatal编程技术网

AngularJS:使用工厂控制服务数据

AngularJS:使用工厂控制服务数据,angularjs,angular-services,angularjs-factory,Angularjs,Angular Services,Angularjs Factory,我试图从两个独立的控制器“控制”工厂中的数据,虽然下面的代码工作正常,但并不总是有效。无论出于何种原因,它只在大约50%的时间绑定数据。是否有办法确保数据始终处于绑定状态,并且如果任一控制器对数据进行编辑,则更改将反映在两端 服务: angular.module('service', ['ngResource']). factory('Service', function($resource){ return $resource('/api/data/:id', {id:

我试图从两个独立的控制器“控制”工厂中的数据,虽然下面的代码工作正常,但并不总是有效。无论出于何种原因,它只在大约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
功能,我可以让它一直工作。数据是绑定的,但angular需要知道要注意什么,如下面的答案所示

要想不必在“工厂”(也称为角度服务)中手动设置数据,您只需在资源的回调中进行设置:

 return {
            getData: function(id){
              return Service.query({id: id}, function(data){
                myData = data;
              });
            },
 return {
                getData: function(id, cb){
                  return Service.query({id: id}, function(data){
                    myData = data;
                    if (cb) {cb(data);}
                  });
                },
如果不想处理promise对象,可以向getData函数发送自己的回调,完成后,调用在资源回调中发送的回调:

 return {
            getData: function(id){
              return Service.query({id: id}, function(data){
                myData = data;
              });
            },
 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;
});

我将控制器切换为使用回调,以避免使用promise对象,这非常好。但是,我无法在getData函数回调中设置this.mydata。这个错误很简单,它是未定义的,因为我猜它不在范围内。你对如何设置这个有什么想法吗?我想这就是为什么它只在某些时候起作用的根源。试着去掉“this”而只引用myData。在工厂服务中声明“var myData=”“”。我遇到的问题与未定义的问题相同。我不确定为什么这个变量不能从成功回调中访问,但事实并非如此。哦,我想你的意思是你希望数据返回工厂。getData的回调?我编辑了答案。我在上面的问题上又添加了一些。我很好地恢复了数据,但仍然无法在getData函数中设置数据。我必须调用setData来设置它,它似乎只有50%的时间有效。