2014-01-06 3 views
1

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

window.App = angular.module('Plant', ['ngResource']) 

App.factory 'Plant', ['$resource', ($resource) -> 
    $resource '/api/plants' 
] 

App.controller 'PlantCtrl', ['$scope', 'Plant', ($scope, Plant) -> 
    $scope.plants = Plant.query() 

    $scope.totalCost = -> 
    # code to sum up the #cost of all the plants 

    $scope.addPlant = -> 
    # code to create a new plant 
] 

Coming из тяжелого фона Rails, моя первая мысль была стройной до контроллера, перемещая totalCost логики в Plant заводе. После того, как все виды махинаций и бесконечного чтение о разнице между службами и фабриками, только работая реализацией я смог найти:

  • Оставьте завод в одиночку
  • Создать службу со всеми родственной моделью методов в мне нужно
  • Сделать фабрику доступной службы
  • сделать сервис доступным для контроллера

Вот код:

App.factory 'Plant', ['$resource', ($resource) -> 
    $resource '/api/plants' 
] 

App.service 'PlantService', ['Plant', (Plant) -> 
    @all = -> 
    Plant.query() 

    @totalCost = (plants) -> 
    # code to sum of #cost 
] 

App.controller 'PlantCtrl', ['$scope', 'PlantService', ($scope, PlantService) -> 
    $scope.plants = PlantService.all() 

    $scope.totalCost = -> 
    PlantService.totalCost($scope.plants) 

    $scope.addPlant = -> 
    # code to create a new plant 
] 

Не был доволен этим, но мой контроллер был тоньше, и это было слишком долго, поэтому я был готов уладить. Затем я понял, что использую 1.0.6, и когда я заменил свои угловые файлы последними (1.2.7 на момент написания), все перестало работать, и мне показалось, что все слишком знакомы ...has no method all().

Если кто-то предложил рефакторинг, чтения или троллинг оскорблений, как я делаю это все неправильно - я все уши. Основная цель - переместить логику, связанную с моделью, из моего контроллера, на охоту за правильной реализацией.

ответ

0

Две вещи, которые я знаю из рук, которые изменились между этими версиями. Теперь вам нужно отдельно указать ng-route.js, а ваш основной модуль зависит от ngRoute, если вы используете встроенную маршрутизацию. Во-вторых, если вы используете ng-bind-html, вам нужно будет изменить это на ng-bind и использовать $ sce.trustAsHtml() в строке, которую вы планируете показать там.

Для более тщательной проверки на изменения идут в журнал изменений здесь:

https://github.com/angular/angular.js/blob/master/CHANGELOG.md

Проверьте ломка изменения секции из 1.0.6 на 1.2.7, чтобы найти все, что вы можете столкнуться в обновлении.

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