2013-08-29 3 views
1

Я пытаюсь «контролировать» данные на заводе от двух отдельных контроллеров, и хотя приведенный ниже код работает нормально, он не всегда работает. По какой-либо причине он связывает данные только в 50% случаев. Есть ли способ убедиться, что данные привязываются все время, и если либо контроллеры вносят изменения в данные, что изменения будут отражаться на обоих концах.AngularJS: данные об услугах управления с фабрикой

Услуги:

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); 
}); 

Если есть лучший способ сделать это так, что я не должен установить данных на заводе, что было бы неплохо. Также было бы неплохо не иметь дело с объектом обещания в контроллере, но я не думаю, что можно было бы получить данные на заводе.

После установки данных с использованием вышеуказанного завода я доступ к нему в другой контроллер со следующим кодом:

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

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

    Factory.setData(item); 

В конце концов, я хочу, чтобы иметь возможность получить доступ к тем же изменяющуюся данные из обоих контроллеров. Вышеупомянутые работы, но только в некоторые моменты времени, и я не уверен, что не получается.

EDIT: Я смог заставить его работать все время, используя функциональность в контроллере по функции обратного вызова. Данные привязаны, но угловатые должны знать, что смотреть, как это предлагается в ответе ниже.

ответ

0

Чтобы не нужно вручную установить данные в «фабрики» (он же угловой сервис), вы можете просто установить его в обратный вызов к ресурсу:

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

Если вы хотите, чтобы не иметь дело с объект обещание, вы можете отправить в обратный вызов вашей собственной к функции 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; 
}); 
+0

Я переключил контроллер, чтобы использовать обратный звонок, чтобы избежать использования объекта обещания, который действительно хорош. Однако я не могу установить this.mydata в обратном вызове функции getData. Ошибка проста, что она не определена, потому что я предполагаю, что она не в сфере видимости. Есть ли у вас какие-либо идеи о том, как это установить? Я предполагаю, что это корень, почему он работает только некоторое время. –

+0

Попробуйте потерять «это» и просто ссылайтесь на myData. Объявите 'var myData = ""' в сервисе Factory. – BoxerBucks

+0

У меня такая же проблема, что она не определена. Я не уверен, почему эта переменная была бы недоступна из обратного вызова успеха, но это не так. –

Смежные вопросы