2014-09-04 4 views
1

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

var LevelsHere = $http.get("my.json") 
      .success(function(data){ 
      var dataCopy = angular.copy(data); 
      return dataCopy; 
      }); 
return { 
    all: function() { 
     return LevelsHere; 
    } 
    }; 

Это прекрасно работает, но у меня есть кнопка, которую я хочу, чтобы вызвать эту функцию и обновить его, чтобы он получает чистую копию из my.json (так что любой изменения возвращаются).

Просто для уточнения, в каждом контроллере я называю его в сферу внутри контроллера, как так

UserService.all().then(function(data){ 
      $scope.storeHere= data.data;  
     }); 

Я имею в виду, может быть что-то вроде $ rootscope может быть путь, потому что я делюсь между контроллеры. Итак, у вас есть общая область полномочий (которая является копией json) между контроллерами. Затем, когда я нажму кнопку обновления, он обновит этот корневой каталог с новой копией my.json, чтобы изменения вернулись обратно.

Может быть, я могу использовать метод, который я пытаюсь сейчас? Я попробовал, чтобы кнопка обновления вызывала $ get снова, но она не была привязана к обоим местам, поэтому она только обновлялась в одном контроллере.

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

Вот моя попытка на обновления:

$scope.cancelProcedure = function() { 
     //refresh data 
     UserService.all().then(function(data){ 
      $scope.levels = data.data; 

    }; 

Проблема с этим он называет текущие данные, и не обновляется с новым вызовом. Я не уверен, как сделать это обновление в обоих местах. Благодаря!!

+0

Звучит просто, но один вопрос: действительно ли оба контроллера нуждаются в независимых копиях данных или той же копии? Вы угловались. Копирование данных, вот почему я прошу ... – mbernath

+0

Нет, они вообще не на самом деле. – ajmajmajma

ответ

1

Чтобы дать вам ответ, я предполагаю следующее:

  • Там один ресурс, который вы хотите получить my.json и обновление время от времени.
  • Вы хотите получить доступ и обновлять данные из двух (или более) контроллеров
  • Вы не хотите, чтобы загрязнить $rootScope

В этом случае идеальным решением будет хранить метод, чтобы получить/обновить данные на заводе, а также текущие данные. В каждом контроллере, где вам нужны эти данные, вы просто вводите завод и назначаете его $scope этого контроллера.

Вот один пример:

angular.factory('dataFactory', ['$http', function ($http) { 

    var dataFactory={}; 

    dataFactory.currentData = null; 

    dataFactory.update = function() { 
    return $http.get("my.json") 
    .success(function(data){ 
     dataFactory.currentData = data; 
     return data; 
    }); 
    }; 

    return dataFactory; 

}]); 

angular.controller('firstCtrl', ['$scope', 'dataFactory', function ($scope, dataFactory) { 
    $scope.data = dataFactory; 
}]); 

angular.controller('secondCtrl', ['$scope', 'dataFactory', function ($scope, dataFactory) { 
    $scope.data = dataFactory; 
}]); 

В вашем HTML вы можете использовать, например, ng-bind="data.currentData" и ng-click="data.update()".

Дальнейшие мысли. Если вы не хотите вводить завод в свои контроллеры $scope, вы можете даже рассмотреть возможность дальнейшего разложения логики и создания одной или двух директив, основанных на этой фабрике. Однако, если это имеет смысл, нелегко сказать с данной информацией.

+0

Если я хочу, чтобы данные заселялись изначально, могу ли я просто установить фабрику данных на $ http.get, который только запускается изначально? то я мог бы вызвать фабрику данных для обновления. мысли? Причина, по которой я спрашиваю, заключается в том, что я должен был выполнить UserService.all(). Then (function (data) {$ scope.listTable = data.data;}); в контроллере, чтобы убедиться, что ajax запускается для первоначального заполнения. мысли? Благодаря! – ajmajmajma

+0

Обычно вы делаете начальную совокупность либо с помощью функции 'app.run', либо вы будете использовать разрешение маршрута ngRouter или UI-Router. Используйте последний пример. если вам нужно только его инициализировать для определенных маршрутов. Для начала первое решение может быть проще реализовать. См. «Запуск блоков» в [Угловая документация] (https://docs.angularjs.org/guide/module) – mbernath

+0

Итак, я могу запустить get .run, а затем передать его на завод? – ajmajmajma

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