#javascript #angularjs #angularjs-directive #angularjs-service #angularjs-controller
#javascript #angularjs #angularjs-директива #angularjs-сервис #angularjs-контроллер
Вопрос:
Мое текущее понимание AngularJS говорит мне, что директивы должны содержать только манипуляции с DOM и обслуживать все, что связано с логикой и обработкой данных.
В моем случае я не уверен, что использовать. Я получил объект, который содержит три функции:
// Creates a documentFragment amp; normal element.
// Returns the fragment.
createElem: function(htmlStr) {
var frag = document.createDocumentFragment(),
temp = document.createElement("div");
temp.innerHTML = htmlStr;
while (temp.firstChild) {
frag.appendChild(temp.firstChild);
}
return frag;
},
// Removes all created childNodes.
deleteElem: function(htmlStr) {
while (htmlStr.firstChild) {
htmlStr.removeChild(htmlStr.firstChild);
}
},
// Redirects to page.
openGate: function(keyStr) {
var open = function() {
$location.path("/" keyStr).replace();
$rootScope.$apply();
};
setTimeout(open, 500);
}
Я хочу иметь доступ ко всем из них через мое приложение AngularJS.
Но я не уверен, должен ли я сделать это сервисом или директивой.
Причины против директивы
Все они (хорошо, может быть, два из трех) напрямую не управляют или не изменяют DOM. Даже если я создаю и удаляю элементы, они должны применяться где-то еще, например elem.insertBefore( createElem("<div></div>") );
, в контроллере. openGate();
Функция просто изменяет местоположение и не имеет абсолютно никакого отношения к DOM.
Причины против сервиса
На самом деле я не обрабатываю какие-либо данные. В createElem();
я создаю documentFragment
, который является узлом без родительского элемента. Итак, если я вызову функцию, внутри моего DOM ничего не произойдет, пока я не вставлю ее куда-нибудь.
Может быть, мне следует разделить их на директивы и службы? В противном случае они всегда будут оставаться в одном и том же контексте.
Ответ №1:
Вы правильно разделили функции на директивы и сервисы.
Сервисы предназначены не только для обработки логики. Основная цель сервисов — содержать информацию, предназначенную для совместного использования с другими частями вашего сайта, такими как контроллеры и директивы. Итак, вы можете думать об этом так:
Я собираюсь манипулировать DOM? Используйте директиву.
Собираюсь ли я делиться этой информацией между различными компонентами моего сайта? Используйте сервис (т.Е. Сервис, фабрику или поставщика).
Комментарии:
1. Спасибо, это прояснило мой разум. Но как насчет
openGate();
? Он не передает информацию через приложение и не манипулирует DOM.2. Если это не та функция, которую вы хотите использовать в нескольких местах, не стесняйтесь помещать ее в контроллер.
3. Если это ответило на это за вас, не могли бы вы отметить правильный ответ, пожалуйста! Спасибо!