Директива AngularJS или сервис?

#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. Если это ответило на это за вас, не могли бы вы отметить правильный ответ, пожалуйста! Спасибо!