将angularjs指令添加到本机html元素(输入文本,div,span等)?

时间:2015-09-24 15:11:35

标签: javascript html angularjs angularjs-directive angularjs-compile

我有类似的东西 -

<input type="text" value="" title="Title"> ...

如何将我的自定义指令作为属性添加到页面上的现有html元素,让我们说 - 指令为categoryLookup -

<input type="text" value="" title="Title" category-lookup> ...

我需要在页面加载时动态执行此操作,即使输入文本按指令逻辑运行。

提前致谢。

1 个答案:

答案 0 :(得分:2)

您可以在定位元素后利用$compile执行此操作。我在此示例中添加了id并使用了vanilla JS,但您可以使用更多内容,例如: jQuery的。获得元素后,只需在关联的控制器中$compile。请注意以下示例...

<div ng-app="app" ng-controller="ctrl">
    <input id="myInput" type="text" title="Title"> 
</div>
angular.module('app', [])
.controller('ctrl', function($scope, $compile) {
    $compile(angular.element(document.getElementById('myInput')).attr('category-lookup', 'category-lookup'))($scope)
})
.directive('categoryLookup', function() {
    return {
        restrict: 'A',
        link: function(scope, elem, attrs) {
            console.log('directive registered')
        }
    }
});

JSFiddle Link - 演示

此外,“动态加载页面”可能意味着少数事情。我假设你是一个完全充实的AngularJS生态系统,但确实存在你甚至没有控制器并且需要以某种方式解释这个指令并在“加载”上编译它的概念。这是一个如何做到这一点的实例,但是,它通常被认为是一种不好的做法,而在相关的控制器中利用上述逻辑是更可取的。请注意以下内容......

<div ng-app="app">
    <input id="myInput" type="text" value="" title="Title"> 
</div>
angular.element(document).ready(function () {

    var $injector = angular.injector(['ng', 'app']);

    $injector.invoke(function($rootScope, $compile) {
        $compile(angular.element(document.getElementById('myInput')).attr('category-lookup', 'category-lookup'))($rootScope)
    });
});

JSFiddle Link - 演示 - 无控制器