Я пытаюсь переписать большую и сложную форму, которая делает все в контроллере. Я начал с разделения связанных функций на свои собственные модули / сервисы. Я не понимаю, как я должен поддерживать данные формы, не перегружая контроллер и не требуя передачи чрезмерного количества аргументов в сервисную функцию.
Мой текущий подход заключается в установке переменных в службе, затем использовании этой службы в других службах и попытке доступа к сохраненным данным. Это не похоже на работу. Я думаю, это потому, что внедрение службы в другой создает новый экземпляр без всех сохраненных значений.
Вот плункер, который обобщает этот подход: https://plnkr.co/edit/vyKtlXk8Swwf7xmoCJ4q
let app = angular.module('myApp', []);
app.service('productService', [function() {
let products = [
{ name: 'foo', value: 'foo' },
{ name: 'bar', value: 'bar' },
{ name: 'baz', value: 'baz' }
];
let selectedProduct = null;
this.getAvailableProducts = function() {
return products;
}
this.setSelectedProduct = function(product) {
selectedProduct = product;
}
}]);
app.service('storeService', ['productService', function(productService) {
let states = [
{ name: 'SC', value: 'SC' },
{ name: 'GA', value: 'GA' },
{ name: 'LA', value: 'LA' }
];
let selectedState = '';
this.getAvailableStates = function() {
return states;
}
this.setSelectedState = function(state) {
selectedState = state;
}
this.getPrice = function() {
// This console.log will always return undefined.
// productService.selectedProduct is not available.
console.log(productService.selectedProduct);
if (productService.selectedProduct == "foo" && selectedState == 'SC') {
return 10;
}
return 5;
}
}]);
app.controller('myController', function($scope, storeService, productService) {
$scope.name = '';
$scope.deliveryState = '';
$scope.selectedProduct = null;
$scope.price = 0;
$scope.productSelection = productService.getAvailableProducts();
$scope.states = storeService.getAvailableStates();
$scope.productChanged = function() {
productService.setSelectedProduct($scope.selectedProduct);
$scope.price = storeService.getPrice();
}
$scope.stateChanged = function() {
storeService.setSelectedState($scope.deliveryState);
$scope.price = storeService.getPrice();
}
});
Я пытаюсь избежать чего-то подобного:
$scope.price = storeService.getPrice(
$scope.state,
$scope.selectedProduct,
$scope.servicePackage,
$scope.serviceFee,
$scope.shippingSelection,
// etc…
);
Должен ли я создавать третий сервис, который устанавливает и получает все данные других сервисов?
Должен ли я просто сохранить все данные на контроллере?