2015-05-28 2 views
0

Использование:Держите содержание пользовательской директивы с угловыми

<interactive-button id="test-button" class="grey" text="This is a test" icon-left="add">Hello World</interactive-button> 

Выход:

<div class="grey button ng-isolate-scope" id="test-button" text="This is a test" icon-left="add" icon-right="delete"> 
    <i ng-if="::iconLeft" class="icon kico add"></i> 
    <span ng-if="::text" class="sentence ng-binding ng-scope">This is a test</span> 
</div> 

Директива модуля:

/** 
* Created by stephanbijzitter on 28/05/15. 
*/ 
(function() { 
    var directive_name = 'interactiveButton'; 
    var template_file = '/angularTemplates/interactive.button.template.html'; 
    var module = angular.module(directive_name, [template_file]); 

    module.directive(directive_name, function() { 
     return { 
      replace: true, 
      restrict: 'E', 
      scope: { 
       text: '@', 
       iconLeft: '@', 
       iconRight: '@' 
      }, 
      templateUrl: template_file 
     }; 
    }); 

    angular.module(template_file, []).run(['$templateCache', function($templateCache) { 
     $templateCache.put(template_file, 
      '<div class="button">\n' + 
      ' <i ng-if="::iconLeft" class="icon kico {{::iconLeft}}"></i>\n' + 
      ' <span ng-if="::text" class="sentence">{{text}}</span>\n' + 
      ' <i ng-if="::iconRight" class="icon kico {{::iconRight}}"></i>\n' + 
      '</div>' 
     ); 
    }]); 
}()); 

В образце использования, вы можете увидеть Hello World между открытие и закрытие тегов пользовательской директивы. Я хочу иметь возможность работать с этим контентом. Мне не нравится использовать параметр text=... в моей директиве.

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

Возможно ли это, и если да, то каким образом?

+0

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

+1

Отключить: https://docs.angularjs.org/api/ng/directive/ngTransclude –

+0

Awesome @SergiuParaschiv, который работает как шарм, если вы хотите, не стесняйтесь представить ответ, и я помечаю его как решение. Обновленная директива: https://gist.github.com/StephanBijzitter/b1b74906f5894512d6a6 –

ответ

1

Использование transclusion:

module.directive(directive_name, function() { 
    return { 
     replace: true, 
     restrict: 'E', 
     translcude: true 
     scope: { 
      iconLeft: '@', 
      iconRight: '@' 
     }, 
     templateUrl: template_file 
    }; 
}); 

angular.module(template_file, []).run(['$templateCache', function($templateCache) { 
    $templateCache.put(template_file, 
     '<div class="button">\n' + 
     ' <i ng-if="::iconLeft" class="icon kico {{::iconLeft}}"></i>\n' + 
     ' <span class="sentence"><ng-transclude></ng-transclude></span>\n' + 
     ' <i ng-if="::iconRight" class="icon kico {{::iconRight}}"></i>\n' + 
     '</div>' 
    ); 
}]); 


<interactive-button id="test-button" class="grey" icon-left="add">This is a test</interactive-button> 
+0

Мне это нравится, он сохраняет код очень чистым и работает так, как должен. Есть один недостаток, потому что 'ng-if' на элементе' span', вероятно, нужно удалить, если только нет способа проверить, есть ли переведенный контент? –

+0

К сожалению, для этого вам необходимо проверить DOM самостоятельно в функции 'link' директивы: http://stackoverflow.com/questions/25173733/how-to-determine-if-exist-transclude-content-in-directive –

0

Вы можете использовать link, чтобы получить элемент, и если у вас есть элемент, вы можете делать с ним все, что захотите. Например:

module.directive(directive_name, function() { 
    return { 
     replace: true, 
     restrict: 'E', 
     scope: { 
      text: '@', 
      iconLeft: '@', 
      iconRight: '@' 
     }, 
     link: function(scope, element, attr){ 
      var yourText = element.text(); 
     }, 
     templateUrl: template_file 
    }; 
}); 

Я думаю, что это то, что вы ищете. Я не тестировал код, но все должно быть хорошо.

+0

Кажется, что содержимое 'yourText' верное, но присвоение его области видимости и ее замене' {{text}} ', кажется, хлопотно , так как он выводит '{{text}}' вместо фактического (нового) значения. –

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