ng-include不使用脚本类型="text/ng-template"

JHi*_*son 12 angularjs

这是我的Plunker:

http://plnkr.co/edit/oIei6gAU1Bxpo8VUIswt

单击该按钮时,应在"Hello World!"之前插入以下内容!跨度:

<script type="text/ng-template" id="tempTest">
  <div>
    <span>Properly Inserted</span> 
  </div>
</script>
Run Code Online (Sandbox Code Playgroud)

当然,减去脚本标签.

我通过动态插入以下div实现此目的:

<div ng-include="tempTest"></div> 
Run Code Online (Sandbox Code Playgroud)

然后编译它.但是,如果查看日志,编译后剩下的唯一内容是:

<!-- ngInclude: tempTest --> 
Run Code Online (Sandbox Code Playgroud)

这里发生了什么?为什么我的插件没有正确编译?逻辑如下:

$scope.insert = function(){
    // Create elements //
    var container = angular.element('<div id="compiled-container"></div>');
    var element = angular.element('<div ng-include="tempTest"></div>');

    //Insert parent Container
    $('#greeting').before(container);

    // insert the element
    $animate.enter(element, container);

    // test insertion
    console.log("Before Compile: " +container.html() )

    $compile(element);

    //look again after compile
    console.log("After Compile:  " +container.html() )

};
Run Code Online (Sandbox Code Playgroud)

ang*_*iel 45

快速的答案可能是:

<div ng-include="'tempTest'"></div>
可能你只是忘记引用模板的单引号.

漫长的答案:

不建议访问控制器内的DOM - 因为代码会被$scope.$apply()调用充斥,你会遇到麻烦.考虑使用指令实现此功能.我试着从你的代码中创建一个起点

http://plnkr.co/UWUCqWuB9d1dn6Zwy3J3

var app = angular.module('plunker', ['ngAnimate']);

app.directive('greeting', function($compile){
  return {
    restrict: 'E',
    scope: {
      name: '='
    },
    template: '<div>'+
              '  <span>Hello {{name}}!</span>'+
              '  <button ng-click="insert()">test</button>'+
              '</div>',
    link: function(scope, element, attrs) {
       scope.insert = function() {
         var container = angular.element('<div ng-include="\'tempTest.html\'"></div>');
         element.before($compile(container)(scope));
       }
    }
  }
})

app.controller('MainCtrl', function($scope) {
  $scope.name = 'World';
});
Run Code Online (Sandbox Code Playgroud)
<greeting name="name"></greeting>
Run Code Online (Sandbox Code Playgroud)

模板元素在Hello World之前插入!每次单击按钮时都会显示textnode.

旁注你甚至不需要,scope{ name: '='}因为指令将继承其周围的范围,但它是一种更清晰的方式将控制器变量显式传递(实际绑定)到指令.