1

Я использую Angular для разработки комментариев для веб-приложения. В настоящее время существует два раздела в приложении были пользователь может оставлять комментарии:Угловой - код повторного использования (служба или контроллер)

  • Категория
  • Продукт

Около 90% от комментирования функциональности одинакова для обоего секций и как таковые, я бы как сделать это многоразовым, т. е. написать некоторую услугу или контроллер, которые я могу ссылаться/использовать в качестве базы.

До сих пор мои исследования, похоже, указывают на использование заводской службы, но, к сожалению, это не работает (я провел весь день, выполняя различные учебные пособия).

Вполне возможно, что я перестал думать об этом и сделать его слишком сложным, но я, честно говоря, не знаю, каким путем обратиться.


При этом быстрый и грязный обзор того, что я до сих пор:

вид
  1. HTML для категории
  2. контроллера для категории (получает данные от служебных данных и сообщений для службы в целях для привязки данных к модели)
  3. Служба по данной категории (извлекает и сохраняет все необходимые данные )
    Продукт использует ту же логику и много о f код в службе и контроллере будет дублироваться. Я объединил две службы в одну службу успешно, но у меня возникли проблемы с тем же для контроллера.

Do I:

  1. Написать базовый контроллер, который будет взаимодействовать с указанной выше службы, и что будет Подвод с двумя существующими контроллерами
    ИЛИ
  2. Написать обслуживание завода/поставщика, что крючки до двух существующих контроллеров, а также вышеупомянутой услуги.
+0

Лично я хотел бы начать с директивы, используя один из контроллеров, который работает. Затем определите, какие части отличаются друг от друга, поэтому вы можете определить их как атрибуты для перехода в область действия. Услуги могут быть введены в директиву в любое время. Несколько вещей, которые вам, вероятно, нужно будет передать сразу, будут «родительский элемент» и «тип». Последний будет использоваться для большинства ваших условных логических я подозреваю – charlietfl

+0

Поставщики завода - это путь для общей функциональности. Вы сказали, что пытались, и это не сработало. Что конкретно не сработало? Покажите нам свой проблемный код и позвольте нам помочь вам в этом. Кстати, вы не можете вводить '$ scope' в заводских провайдерах. – georgeawg

+0

Я последовал совету @ S.Simpson, и теперь я могу «получить доступ» к необходимым методам на общей фабрике. Кажется, это работает. Моя единственная проблема в том, что я получаю сообщение «Не могу прочитать свойство», а затем «неопределенного». В условиях неспециалиста это то, что происходит: Контроллер вызывает функцию в общей службе. Совместно используемая услуга, в свою очередь, вызывает функцию в конкретной службе (например, в категории или продукте). Последний дает обещание. Я подозреваю, что должен вернуть обещание в службе обмена? – Ronin

ответ

0

Если вы идете по пути использования фабрики, вы можете поместить все общие функции в свой объект возврата и ссылаться на них с ваших контроллеров.

завод

angular.module('myModule').factory('CommonFunctions', function(){ 
    return { 
    foo : foo, 
    bar : bar 
    } 

    function foo(){ 
    console.log('foo'); 
    }; 
    function bar(){ 
    console.log('bar'); 
    }; 
} 

Контроллер

angular.module('myModule') 
     .controller('myController', ['CommonFunctions', function(CommonFunctions) { 
    var vm = this; 
    vm.foo = CommonFunctions.foo(); 
    vm.bar = CommonFunctions.bar(); 
} 
+0

Благодарим вас за помощь. Идите в правильном направлении. Теперь я получаю сообщение «Не могу прочитать свойство», а затем «неопределенного». См. Мой комментарий выше для более подробной информации. – Ronin

+0

Поскольку вы работаете с обещанием, вы можете сделать 2 вещи. Вы можете обновить эту информацию после того, как обещание разрешит объект и вернет объект, который будет обновлен до контроллера. Поскольку javascript передает объекты по ссылке, когда объект на обновлениях службы так же будет отображаться на контроллере. Другой способ состоял бы в том, чтобы вернуть обещание контроллеру и сделать разрешение там, но обычно вы хотите, чтобы ваши контроллеры выполняли достаточно логики, чтобы справляться с тем, что происходит в их соответствующем представлении. –

0

углового-х разделение типов услуг, то есть:

  • для конкретных значений

    • константа
    • значение
    • (константа для конкретных значений, необходимых до создания других услуг)
  • для функций

    • фабричных
    • сервис
    • поставщика
    • (поставщик для конкретных случаев, когда вам нужна служба до создания других услуг, как правило, пользуясь констант)

позволяет возможности обмениваться данными и способами обработки этих данных между контроллерами и или директивы, все, что может быть 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()); 
} 

я знаю, тот много для простого примера, но есть много возможностей, предоставляемых угловатые, и много способов использовать их, надеюсь, это помогает.

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