Angularjs - передать аргумент в директиву
Im интересно, есть ли способ передать аргумент директиве?
то, что я хочу сделать, это добавить директиву от контроллера такой:
$scope.title = "title";
$scope.title2 = "title2";
angular.element(document.getElementById('wrapper')).append('<directive_name></directive_name>');
можно ли передать аргумент одновременно, чтобы содержимое моего шаблона директивы могло быть связано с той или иной областью?
вот эта директива:
app.directive("directive_name", function(){
    return {
        restrict:'E',
        transclude:true,
        template:'<div class="title"><h2>{{title}}</h3></div>',
        replace:true
    };
})
Что делать, если я хочу использовать ту же директиву, но с $scope.title2?
4 ответов
вы можете передать аргументы в свою пользовательскую директиву, как вы это делаете с помощью встроенных угловых директив, указав атрибут в элементе директивы:
angular.element(document.getElementById('wrapper'))
       .append('<directive-name title="title2"></directive-name>');
что вам нужно сделать, это определить scope (включая аргумент (ы) / параметр(ы)) в заводской функции вашей директивы. В приведенном ниже примере директива принимает title-параметр. Затем вы можете использовать его, например, в template, используя регулярный угловой путь: {{title}}
app.directive('directiveName', function(){
   return {
      restrict:'E',
      scope: {
         title: '@'
      },
      template:'<div class="title"><h2>{{title}}</h2></div>'
   };
});
в зависимости от того, как и что вы хотите связать, у вас есть различные варианты:
- 
=двусторонняя привязка
- 
@просто считывает значение (одно-жильных)
- 
&используется для привязки функции
в некоторых случаях вы можете использовать "внешнее" имя, которое отличается от" внутреннего " имени. С внешним я имею в виду имя атрибута на элементе директивы и с внутренним я имею в виду имя переменной, которая используется в области действия директивы.
например, если мы посмотрим на директиву выше, вы не захотите указывать другой дополнительный атрибут для заголовка, даже если вы внутренне хотите работать с title-недвижимость. Вместо этого вы хотите использовать директиву следующим образом:
<directive-name="title2"></directive-name>
это может быть достигнуто путем указания имени за вышеупомянутым параметром в определении области:
scope: {
    title: '@directiveName'
}
Пожалуйста, также обратите внимание на следующие вещи:
- HTML5-спецификация говорит, что пользовательские атрибуты (это в основном то, что повсюду в угловых приложениях) должны иметь префикс data-. Угловые поддержки это путем обнажатьdata--префикс из любых атрибутов. Таким образом, в приведенном выше примере вы можете указать атрибут элемента (data-title="title2") и внутренне все было бы так же.
- атрибуты на элементах всегда в виде <div data-my-attribute="..." />а в код (например, свойства объекта scope) они находятся в видеmyAttribute. Я потерял много времени, прежде чем понял это.
- для другого подхода к обмену / обмену данными между различными угловыми компонентами (контроллерами, директивами) вы можете взглянуть на службы или контроллеры директив.
- вы можете найти более подробную информацию о угловая Домашняя страница (директивы)
вот как я решил мою проблему:
директива
app.directive("directive_name", function(){
    return {
        restrict: 'E',
        transclude: true,
        template: function(elem, attr){
           return '<div><h2>{{'+attr.scope+'}}</h2></div>';
        },
        replace: true
    };
})
контроллер
$scope.building = function(data){
    var chart = angular.element(document.createElement('directive_name'));
    chart.attr('scope', data);
    $compile(chart)($scope);
    angular.element(document.getElementById('wrapper')).append(chart);
  }
теперь я могу использовать разные области через ту же директиву и добавлять их динамически.
Вы можете попробовать, как показано ниже:
app.directive("directive_name", function(){
return {
    restrict:'E',
    transclude:true,
    template:'<div class="title"><h2>{{title}}</h3></div>',
    scope:{
      accept:"="
    },
    replace:true
  };
})
Он устанавливает двустороннюю привязку между значением атрибута "accept" и родительской областью.
а также вы можете установить двустороннюю привязку данных со свойством:'='
например, если вы хотите привязать ключ и значение к локальной области, вы должны сделать:
  scope:{
    key:'=',
    value:'='
  },
подробнее, https://docs.angularjs.org/guide/directive
Итак, если вы хотите передать аргумент из контроллер к директиве, затем обратитесь к этому ниже fiddle
http://jsfiddle.net/jaimem/y85Ft/7/
надеюсь, что это помогает..
<button my-directive="push">Push to Go</button>
app.directive("myDirective", function() {
    return {
        restrict : "A",
         link: function(scope, elm, attrs) {
                elm.bind('click', function(event) {
                    alert("You pressed button: " + event.target.getAttribute('my-directive'));
                });
        }
    };
});
вот что я сделал
Я использую директиву в качестве атрибута html, и я передал параметр следующим образом в моем HTML-файле. my-directive="push" и из директивы я извлек его из объекта события щелчка мыши. event.target.getAttribute('my-directive').
