2013-05-29 3 views
3

Некоторые директивы моей программы должны иметь довольно сложную манипуляцию с DOM и некоторые другие действия как в функции компиляции, так и в ссылках. Если я не использовал директивы, я бы разделил этот код на функции и вывел их вне компиляции fn.AngularJS: вспомогательные функции рефакторинга из компиляции() и ссылки()

На данный момент у меня есть:

directive('myDir',...): 
compile: function (element, attrs) { 
    var a1,a2; 
    a1 = action1() {...}; 
    a2 = action2() {...}; 

    a1(); a2(); 
    return { link function } 
} 

Вместо этого, я предпочел бы:

directive('myDir',...): 
compile: function (element, attrs) { 
    a1(); a2(); // a1 and a2 declared somewhere else 
    return { link function } 
} 

a1 и a2 может быть объявлено где-то в директиве, чтобы сохранить компонент многократного использования, но, в то же время имеют читаемый код. определение этих функций в настоящее время входит в эту функцию компиляции (не разделяемой между директивами). он нужен только там, и он может быть довольно длинным.

Что было бы красивым способом организовать это?

Я думал о оберточной директиву в функции:

(function() { 
    var a1 = function(params) {}; 
    myapp.directive(...compile and link functions, as usual); 
})(); 

ответ

3

Что-то вроде этого?

myapp.directive('myDir', function() { 
    var a1 = function(params) { 
    }; 
    var a2 = function(params) { 
    }; 
    return { 
    link: ..., 
    compile:... 
    }; 
}); 
+0

хороший, я не рассматривал этот вариант. Я предполагаю, что это более или менее то, что я предложил, но не нуждающийся в дополнительном '(function() {})()'. благодаря! –

0

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

yourApp.directive('yourDirective', ['SomeService', ..., function(SomeService, ...) { 
    return { 
    compile: function(...) { 
     SomeService.action1(...); 
     SomeService.action2(...); 
     ... 
    }, 
    link: ... 
    } 
}]); 
+0

Я тоже рассматривал сервисы, но я думал, что это будет слишком много накладных расходов для вспомогательной функции, особенно потому, что я не буду использовать ее нигде. с другой стороны, это намного лучше для проверки. что вы имели в виду, когда предлагали это решение? –

+1

В зависимости от того, насколько конкретные эти функции относятся к этой директиве, вам может потребоваться выполнить эти действия извне контекста этой конкретной директивы. Одна из возможностей заключается в том, что вы создаете тест A/B и создаете другую директиву для обеспечения аналогичной функциональности. Кроме того, я думаю, что лучше, если это возможно, сохранить логику бизнеса отдельно от логики представления. Это действительно зависит от вашего варианта использования, потому что, если это директивная конкретная логика, я бы сохранил ее в директиве, как предлагалось [gargc] (http://stackoverflow.com/a/16812361/2355083). – rtcherry

+0

Я согласен с тем, что если эти функции имеют смысл как услуга - потенциально многоразовое поведение - хороший подход заключается в том, чтобы обернуть их как услугу, которую можно вводить где-то в другом месте. С другой стороны, проблема, которую я вижу с «злоупотреблениями» услугами для очень специфической функциональности, заключается в том, что угловой не позволяет вам определять «частные» службы в модуле, и все они попадают в одно и то же пространство имен. Поэтому вы должны быть осторожны, избегая конфликтов имен. Одна из идей - использовать префиксы типа myDirectiveModuleMyHelperService. – gargc

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