В последнее время я изучаю 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()
.
Если кто-то предложил рефакторинг, чтения или троллинг оскорблений, как я делаю это все неправильно - я все уши. Основная цель - переместить логику, связанную с моделью, из моего контроллера, на охоту за правильной реализацией.