углового-х разделение типов услуг, то есть:
для конкретных значений
- константа
- значение
- (константа для конкретных значений, необходимых до создания других услуг)
для функций
- фабричных
- сервис
- поставщика
- (поставщик для конкретных случаев, когда вам нужна служба до создания других услуг, как правило, пользуясь констант)
позволяет возможности обмениваться данными и способами обработки этих данных между контроллерами и или директивы, все, что может быть value
, также может быть constant
, единственная разница там, где они могут быть введены. Аналогично, любой service
может быть переписан на factory
или provider
, это скорее ваш конкретный прецедент/то, что более удобное письмо, которое определит, что использовать, но на самом деле лучший способ подумать об этом - это то, для совместного использования, но не требуется внутри angular.module.config
, тогда используйте value
, в противном случае используйте constant
, теперь, если у вас есть одна функция, которую вы хотите разделить (возможно, она каким-то образом обрабатывает это значение или, может быть, просто делает что-то еще), вы должны написать это как фабрика, тогда, когда у вас есть несколько из тех фабрик, которые имеют дело с этим значением, или что-то еще, вы можете объединить их в service
или настроить и объединить их с помощью поставщика. вот простой пример (обратите внимание, я использую рекомендуемый синтаксис для написания угловых услуг):
'use strict';
var app = angular.module('test.app',[]);
app.constant('configureableValue',{defaultValue:55});
app.value('editableValue',{defaultValue:100,editedValue:null});
app.provider('configureValue',configureValueProvider);
configureValueProvider.$inject - ['configureableValue'];
function configureValueProvider(configureableValue){
var defaultVal = configureableValue.defaultValue,
originalVal = defaultVal;
return {
getValue:getValue,
setValue:setValue,
resetValue:resetValue,
'$get':providerFunc
};
function getValue(){
return defaultVal;
}
function setValue(val){
defaultVal = val;
}
function providerFunc(){
return {
get:function(){ return getValue(); },
reset:function(){ resetValue(); }
};
}
function resetValue(){
defaultVal = originalVal
}
}
// this factory is an example of a single function service, this should almost always be defined as a factory
app.factory('getEditableValue',getEditableValue);
getEditableValue.$inject = ['editableValue'];
function getEditableValue(editableValue){
return function(){
return editableValue.editedValue ? editableValue.editedValue : editableValue.defaultValue;
};
}
// same with this one
app.factory('setEditableValue',setEditableValue);
setEditableValue.$inject = ['editableValue'];
function setEditableValue(editableValue){
return function(val){
editableValue.editedValue = val;
}
}
// now this is an example of a service service collecting the factorys for an object with all the related behavior we need
app.service('editableService',editableService);
editableService.$inject = ['getEditableValue','setEditableValue'];
function editableService(getEditableValue,setEditableValue){
var self = this;
self.setVal = setEditableValue;
self.getVal = getEditableValue;
}
app.config(appConfig);
appConfig.$inject = ['configureValueProvider'];
function appConfig(configureValueProvider){
configureValueProvider.setValue('i changed '+ configureValueProvider.getValue() +' to this!!!!');
}
app.run(appRun);
appRun.$inject = ['configureValue','editableService'];
function appRun(configureValue,editableService){
console.log('before editing: ',editableService.getVal());
editableService.setVal('changed!!!');
console.log('after editing: ',editableService.getVal());
console.log('we changed this in the config func: ',configureValue.get());
configureValue.reset();
console.log('and now its back to the original value: ',configureValue.get());
}
я знаю, тот много для простого примера, но есть много возможностей, предоставляемых угловатые, и много способов использовать их, надеюсь, это помогает.
Лично я хотел бы начать с директивы, используя один из контроллеров, который работает. Затем определите, какие части отличаются друг от друга, поэтому вы можете определить их как атрибуты для перехода в область действия. Услуги могут быть введены в директиву в любое время. Несколько вещей, которые вам, вероятно, нужно будет передать сразу, будут «родительский элемент» и «тип». Последний будет использоваться для большинства ваших условных логических я подозреваю – charlietfl
Поставщики завода - это путь для общей функциональности. Вы сказали, что пытались, и это не сработало. Что конкретно не сработало? Покажите нам свой проблемный код и позвольте нам помочь вам в этом. Кстати, вы не можете вводить '$ scope' в заводских провайдерах. – georgeawg
Я последовал совету @ S.Simpson, и теперь я могу «получить доступ» к необходимым методам на общей фабрике. Кажется, это работает. Моя единственная проблема в том, что я получаю сообщение «Не могу прочитать свойство», а затем «неопределенного». В условиях неспециалиста это то, что происходит: Контроллер вызывает функцию в общей службе. Совместно используемая услуга, в свою очередь, вызывает функцию в конкретной службе (например, в категории или продукте). Последний дает обещание. Я подозреваю, что должен вернуть обещание в службе обмена? – Ronin