2013-08-08 2 views
1

Я создаю приложение, которое извлекает данные календаря с помощью вызова AJAX в $ rootScope. Я использую этот объект в разных контроллерах, и мне нужно иметь возможность правильно его анализировать, поскольку в нем есть различные объекты. Где я должен хранить логику для ее анализа? Я использовал его в корневом контроллере как функции $ rootScope, но я чувствую, что это прецедент для фабрики. Однако, похоже, я не могу (и не чувствую, что было бы неплохо) получить доступ к фабричным методам из шаблонов.Где модель логики манипуляции в AngularJS?

На данный момент у меня есть следующий завод:

angular.module('services',[]). 
factory('dataManipulation', function(){ 
    return{ 
     getPerson: function(peopleObj, userID){ 
      //Since each user has a unique ID, this returns an array with one element, 
      // so to simplify the view code, there's a [0] at the end 
      var person= peopleObj.filter(function(element, index, array) { 
       if (array[index].cwid == userID) { 
        return true; 
       } 
      })[0]; 
      return person; 
     } 
    }; 
}); 

И следующее в моем контроллере:

angular.module('app.controllers',[]). 
controller('rootCtrl', ['$rootScope', '$http', 'dataManipulation', 
    function($rootScope, $http, dataManipulation) { 
     $rootScope.getPerson = function(peopleObj, userID){ 
      return dataManipulation.getPerson(peopleObj, userID); 
     } 
    } 
]); 

И это работает, но я просто не уверен, если я отслеживаю лучшие практики.

Итак, должны ли эти функции анализировать модель в корневом каталоге или где-то еще?

+1

Поместите его в сервисный модуль и введите этот модуль в свои контроллеры. –

+0

Я бы построил фабрику «Человек». С вашего контроллера вы можете вызвать Person.get (someIdentifier), который будет загружать один и тот же объект Person с данными или возвращать отдельную модель экземпляра. Взгляните на Угловые ресурсы. Я считаю, что они немного иллюстрируют концепцию для вас. –

ответ

0

Ваше сообщение несколько сбивает с толку (вам нужно разобрать объект?: S), но Я бы воспользовался сервисом или поставщиком или фабрикой (варианты реализации того же самого), чтобы достичь того, что вы описываете. Это позволит вам полностью исключить использование $ rootScope и внедрить ваш сервис/завод в контроллеры, где требуется их использование.

$ scope - это ваша модель (или, скорее, устройство хранения для вашей модели, существуют угрозы, связанные с хранением данных непосредственно против $ scope, т.е. $ scope.x = 1) в контексте вашего углового приложения, и $ rootScope его «глобальный» родитель, который используется в основном для управления областями внутри себя (как я понимаю, я могу ошибаться и пытаюсь подтвердить это) и испускать события в глобальной области, но их можно использовать довольно удобно для хранения данных, хотя это должно следует избегать, где это возможно. IMO Идея состоит в том, чтобы доставить вашу модель в свое угловое приложение как можно ближе к полезному состоянию, так что единственное манипулирование, требуемое для модели в приложении Angular, является чисто презентационным.

+0

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

+0

Я использую сервисы, заводы и провайдеры для работы AJAX, где ресурсов Angulars $ не хватит. http://docs.angularjs.org/api/ngResource.$resource Попробуйте подражать функциональности ресурса $, и вы будете на правильном пути с точки зрения передового опыта (на мой взгляд, это действительно субъективно) –

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