指令的 link 未在范围内呈现变量

Directive's link is not rendering variable in the scope

我期待指令打印模板,其中 {{ }} 内的值已解析,但事实并非如此。它打印出 {{argVal}} 就好像它是 HTML 字符串的一段文字。

myApp.directive('myArgs', [function() {

    var theTemplate = 
        '<span>{</span>' + 
            '<div ng-if="typeIsArray(argVal)">'+
                '<p>{{argVal}}</p>'
                '<my-args arg-val="argVal[0]"></my-args>'
            '</div>';

    return {
        restrict: "E",
        scope: {
            argVal: '='
        },
        controller: ... //contains utils to check type of argVal
        link: function(scope, element){
            alert(scope.argVal);
            element.html('').append(theTemplate);
        }
      };        
}]);

在我的 HTML 文件中,我只是像这样调用指令:

<my-args arg-val="someArray"></my-args> 

(someArray 在控制器中定义为 $scope.someArray = ["ola", "hi", "bonjour"];)

someArray 肯定在范围内,因为 alert(someArray) 正在工作。

那么为什么模板部分不能正确呈现?

您需要使用范围

编译模板
element.html('').append(theTemplate);
$compile(element.contents())(scope);

并且不要忘记为指令提供依赖项 $compile。

您不应将模板直接附加到元素。像这样使用指令的模板属性:

    myApp.directive('myArgs', [function() {

    var theTemplate = 
        '<span>{</span>' + 
            '<div ng-if="typeIsArray(argVal)">'+
                '<p>{{argVal}}</p>'
                '<my-args arg-val="argVal[0]"></my-args>'
            '</div>';

    return {
        restrict: "E",
        scope: {
            argVal: '='
        },
        controller: ... //contains utils to check type of argVal
        template: theTemplate,  // this will eval correctly
        link: function(scope, element){
            alert(scope.argVal);

            // this is not needed
            //element.html('').append(theTemplate);
        }
      };        
}]);