2016-06-22 7 views
0

У меня есть мои данные фабрика ниже, которая возвращает обещаниеПроблемы с привязкой двухсторонней передачи данных между службой и контроллером

.factory('DataService', function($http, $document, CreatorService) { 
    promise = null; 
    jsonData = null; 

     return { 
      getJsonDataFromApi: function() { 
        promise = $http.get('/test'); 
        return promise; 
       } 
      } 
      getJsonData: function() { 
       return jsonData; 
      }, 
      setJsonData: function (data) { 
       jsonData = data; 
      } 
    } 

Мой контроллер делает использование этой услуги следующим

.controller('MainCtrl', function ($scope, $http, $uibModal, DataService, StyleService, CreatorService) { 

$scope.dataService = DataService; 

$scope.dataService.getJsonDataFromApi().success(function (data) { 
    $scope.dataService.setJsonData(data['content']); 
    $scope.jsonData = $scope.dataService.getJsonData(); 

Как вы можете см., я пытаюсь связать $scope.jsonData с данными службы jsonData через $scope.jsonData = $scope.dataService.getJsonData();, но это не работает.

Если я обновляю значение $scope.jsonData(), значение, возвращаемое $scope.dataService.getJsonData(), не изменяется.

Например, если я

$scope.jsonData = {}; 

    console.log($scope.jsonData); 
    console.log($scope.dataService.getJsonData()); 

Выход

{} 
Object{...} 

Я бы ожидал, что они будут одинаковыми. Кажется, я не могу обновить объект службы, если я изменю объект области контроллера, и не могу получить объект моего объекта области управления для обновления, если я внес изменения в объект службы. Я хочу избежать использования часов.

+0

Откуда вы вызываете функцию контроллера? – Ajay

ответ

1

Двусторонняя привязка данных предназначена для связывания с вашим $scope и видами. Не для контроллера и служб. Поэтому, если вам действительно нужно что-то подобное, тогда вам нужно $watch и устанавливать данные в сервисе каждый раз, когда они меняются.

+0

Должен ли я настроить две часы: один для наблюдения за изменениями в объекте области, который затем обновляет объект службы, а затем еще один просмотр объекта службы, который обновляет объект области? – Flame1845

+0

Если вы сделаете это для кеширования своего результата, то вы можете установить свои данные в свой метод 'getJsonDataFromApi', после того как обещание будет разрешено, например:' $ http.get ('/ test'), затем (function (successResponse) {jsonData = successResponse}; ' Теперь вы можете добавить оператор' if' в свой метод 'getJsonDataFromApi':' if (jsonData) возвращает jsonData'. Теперь вы можете называть метод getJsonDataFromApi' насколько он вам нужен, он упустит запрос один раз – yogurt

+0

Если ваша причина не кеширования, объясните, зачем вам это нужно, и я попытаюсь найти «угловой способ» для ее выполнения. – yogurt

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