AngularJS: руководство по внедрению фабрики, сервиса, директивы или чего-то еще
Я очень новичок в angularjs и нуждаюсь в некоторых советах об угловом способе реализации чего-то очень простого. В моем $ scope мне нужно установить некоторые поля по умолчанию, и эти значения по умолчанию необходимы несколько раз в моем контроллере.
Я хочу иметь возможность рефакторировать эти значения по умолчанию в общее место, чтобы проредить контроллер и разрешить повторное использование кода, но не уверен, что это должно быть фабрикой, директивой или службой.
Вот пример значений по умолчанию:
$scope.skills = [{
description: '',
years: "1",
level: "0",
years_values: [
{ id: "1", description: "1" },
{ id: "2", description: "2" },
{ id: "3", description: "3+" }],
level_values: [
{ id: "0", description: "Starter"},
{ id: "1", description: "Intermediate"},
{ id: "2", description: "Advanced"} ]
}]
Вот пример: пример того, где я хотел бы вызвать "новую функцию":
skillSuccess = (resp)->
Loader.hide();
$rootScope.current_user = resp;
#TODO replace this repetition
$scope.skills = [{
description: '',
.... etc
Мои вопросы:
- должен ли я использовать фабрику / директиву/сервис (или что-то еще) для это рефакторинг?
- Как я могу гарантировать, что функция будет вызвана изначально, чтобы значения по умолчанию были доступны для полей когда страница загружается?
2 ответа:
Должен ли я использовать фабрику / директиву / сервис (или что-то еще) для этого рефакторинга?
Контроллер должен использоваться для задания области видимости, но значения по умолчанию должны храниться как константа и возвращаться фабрикой. Фабричный шаблон предпочтительнее здесь, потому что это синглтон.
angular.module('myApp') .factory('skillsFactory', function (defaultSkills) { var service = {}; service.getDefaults = function () { return defaultSkills; }; return service; }) .constant('defaultSkills', [{ description: '', years: "1", level: "0", years_values: [{ id: "1", description: "1" }, { id: "2", description: "2" }, { id: "3", description: "3+" }], level_values: [{ id: "0", description: "Starter" }, { id: "1", description: "Intermediate" }, { id: "2", description: "Advanced" }] }]);Как я могу гарантировать, что функция будет вызвана изначально, чтобы значения по умолчанию были доступны для полей при загрузке страницы?
В вашем контроллер, вызов
$scope.skills = skillsFactory.getDefaults();angular.module('myApp') .controller('skillsCtrl', function ($scope, skillsFactory) { $scope.skills = skillsFactory.getDefaults(); });
Должен ли я использовать завод / директиву/сервис (или что-то еще) для этого рефакторинг?
Я бы предложил вам создать
constant, потому что похоже, что у вас естьdefaultsданные, которые изначально имеют некоторое значение, и которые будут изменены пользователем из внешнего интерфейса. Таким образом, вы можете поместить это в угловую константу, тогда эта константа будет доступна заводу/службе. И Фабрика / обслуживание сделает необходимую манипуляцию от своей функции. Сделать доступной константу в вашем сервисе / заводе вам нужно ввести постоянное имя в свой сервис.Рассматривая ваше текущее требование, вы не должны принимать во внимание компонент
directive.Константа
app.constant('defaults', [{ description: '', years: "1", level: "0", years_values: [ { id: "1", description: "1" }, { id: "2", description: "2" }, { id: "3", description: "3+" }], level_values: [ { id: "0", description: "Starter"}, { id: "1", description: "Intermediate"}, { id: "2", description: "Advanced"} ] }]);Сервис
app.service('dataService', function(defaults){ var dataService = this; dataService.defaults = defaults; dataService.defaults = angular.copy(defaults) //will return same copy every-time dataService.getDefaults = function(){ return dataService.defaults; } //other method will lie here })Как я могу гарантировать, что функция будет вызвана изначально, чтобы значения по умолчанию были доступны для полей при загрузке страницы?
Вы можете просто получить эти значения по умолчанию, используя метод
getDefaultsваш сервис, а затем сохраненные, что извлеченные значения по умолчанию и использовать их для манипулирования. Если вы хотите, чтобы копия defaults создавалась каждый раз, то используйтеangular.copy(defaults), который даст вам копию defaults.Контроллер
app.controller('myCtrl', function($scope, dataService){ $scope.defaults = dataService.getDefaults(); //this will have defaults //...other stuff here... });