我试图通过根据预定义范围编译视图并运行$scope $$digest来测试我的一个模板中的ng-if.
我发现编译的模板出来是一样的,不管我的情况是真实的还是假的.我会期望编译的html删除ng-if dom元素时,falsy.
beforeEach(module('templates')); beforeEach(inject(function($injector,$rootScope){ $compile = $injector.get('$compile'); $templateCache = $injector.get('$templateCache'); $scope = $rootScope.$new(); template = angular.element($templateCache.get('myTemplate.tpl.html')); })); afterEach(function(){ $templateCache.removeAll(); }); it ('my test',function(){ $scope.myCondition = true; $compile(template)($scope); $scope.$digest(); expect(template.text()).toContain("my dom text"); // true and false conditions both have the same effect });
这是一个plunkr试图显示发生了什么(不知道如何测试在plunkr,所以我在控制器中完成)http://plnkr.co/edit/Kjg8ZRzKtIlhwDWgB01R?p=preview
当ngIf放置在模板的根元素上时,会出现一个可能的问题.
ngIf删除节点并在其中放置注释.然后,它会观察表达式,并根据需要添加/删除实际的HTML元素.问题似乎是,如果它放置在模板的根元素上,那么一个注释就是从整个模板中留下的(即使只是暂时的),这被忽略了(我不知道这是否是浏览器 – 具体行为),导致一个空模板.
ngIf删除节点并在其中放置注释.然后,它会观察表达式,并根据需要添加/删除实际的HTML元素.问题似乎是,如果它放置在模板的根元素上,那么一个注释就是从整个模板中留下的(即使只是暂时的),这被忽略了(我不知道这是否是浏览器 – 具体行为),导致一个空模板.
如果确实如此,您可以将您的ngIfed元素包含在< div> ;:::
<div><h1 ng-if="test">Hello,world !</h1></div>
另见这个short demo.
另一个可能的错误是以空白模板结尾,因为它不存在于$templateCache中.即如果你不把它放在$templateCache中,那么以下代码将返回undefined(产生一个空的元素):
$templateCache.get('myTemplate.tpl.html')