templateUrl
在我的角度指令中使用时,我遇到了一些奇怪的行为。
基本上,当我提供时,templateUrl
我似乎无法从链接函数或指令控制器访问评估的属性。链接函数只返回未计算的表达式(例如{{input.text}}
),控制器获取undefined
.
使用 fiddle 演示比解释更容易,所以我在这里创建了一个非常简单的示例。打开控制台并记下输出,然后注释掉templateUrl
属性并重新运行小提琴以查看差异。template
请注意,如果您将模板移出缓存并移入属性,则不会发生这种情况。有人可以解释是什么提供了templateUrl
导致这种行为的变化吗?
为了完整起见,这里是代码:
HTML:
<div ng-controller="MyCtrl">
Text1<input ng-model="input.text"/>
<div d-nested="" d-attr2="{{input.text}}"></div>
</div>
JS:
var myApp = angular.module('myApp',[]);
function MyCtrl($scope) {
$scope.input = {};
$scope.input.text = "some string";
}
myApp.run(['$templateCache', function($templateCache) {
return $templateCache.put('/partials/rhombus.html',
'<span>Just a template.</span>');
myApp.directive('dNested', function(){
return {
transclude: false,
//Comment out the below line to observe the difference.
templateUrl: '/partials/rhombus.html',
replace: false,
controller: function($attrs, $scope){
this.logAttr = function(){
console.log("from controller: " + $attrs.dAttr2);
}
},
link: function(scope, element, attrs, ctrl){
attrs.$observe('dAttr2', function(val){
console.log("from link function: " + val);
ctrl.logAttr();
});
}
}
});
更新
在下面的 Martin 给出了一个有用的回答之后,我看到它现在可以工作了,但是当指令嵌套时(即一个被嵌入到另一个指令中)就不行了。在此处查看更新的小提琴。您仍然会注意到注释掉模板 url 将导致正确的行为。