1

我试图从两个单独的控制器“控制”工厂中的数据,虽然下面的代码工作正常,但它并不总是有效。无论出于何种原因,它仅在大约 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 需要知道要注意什么,如下面的答案中所建议的那样。

4

1 回答 1

0

为了不必在“工厂”(又名角度服务)中手动设置数据,您可以在资源的回调中设置它:

 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;
});
于 2013-08-29T16:45:28.723 回答