Подтвердить что ты не робот

Angularjs - передать аргумент директиве

Мне интересно, есть ли способ передать аргумент директиве?

Что я хочу сделать, это добавить директиву от контроллера следующим образом:

$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?

4b9b3361

Ответ 1

Вот как я решил свою проблему:

Директива

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);
  }

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

Ответ 2

Вы можете передать аргументы в свою настраиваемую директиву, как и со встроенными Angular -directives, указав атрибут в директивном элементе:

angular.element(document.getElementById('wrapper'))
       .append('<directive-name title="title2"></directive-name>');

Что вам нужно сделать, это определить scope (включая аргумент (ы)/параметр (ы)) в функции factory вашей директивы. В приведенном ниже примере директива принимает title -параметр. Затем вы можете использовать его, например, в template, используя обычный Angular -way: {{title}}

app.directive('directiveName', function(){
   return {
      restrict:'E',
      scope: {
         title: '@'
      },
      template:'<div class="title"><h2>{{title}}</h2></div>'
   };
});

В зависимости от того, как/что вы хотите связать, у вас есть разные опции:

  • = - двусторонняя привязка
  • @ просто считывает значение (односторонняя привязка)
  • & используется для привязки функций

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

Например, если мы посмотрим на приведенную выше директиву, вы можете не указывать другой дополнительный атрибут для названия, даже если вы внутренне хотите работать с title -property. Вместо этого вы хотите использовать свою директиву следующим образом:

<directive-name="title2"></directive-name>

Это может быть достигнуто путем указания имени позади вышеупомянутого параметра в определении области:

scope: {
    title: '@directiveName'
}

Также обратите внимание на следующие вещи:

  • Спецификация HTML5 говорит о том, что пользовательские атрибуты (это в основном то, что находится повсюду в приложениях Angular), должны иметь префикс data-. Angular поддерживает это, удаляя data- -prefix из любых атрибутов. Таким образом, в приведенном выше примере вы можете указать атрибут элемента (data-title="title2") и внутренне все будет одинаковым.
  • Атрибуты элементов всегда находятся в форме <div data-my-attribute="..." />, в то время как в коде (например, свойства объекта области) они находятся в форме myAttribute. Я потерял много времени, прежде чем понял это.
  • Для другого подхода к обмену/совместному использованию данных между различными компонентами Angular (контроллерами, директивами) вы можете захотеть взглянуть на службы или директивные контроллеры.
  • Дополнительную информацию о Angular домашней странице (директивы)

Ответ 3

Вы можете попробовать, как показано ниже:

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

Итак, если вы хотите передать аргумент от контроллера к директиве, тогда обратитесь к приведенному ниже скрипту

http://jsfiddle.net/jaimem/y85Ft/7/

Надеюсь, что это поможет.