在元素上应用角度语法{{}}
时,指令attrs.$set
将不起作用。
修改 我的问题是,任何人都可以解释为什么?
如果解析{{}}
,然后解析link
,为什么link
不会修改该元素?
首先link
,{{}}
应该删除,这两种情况都不会这样。
以下是code pen
<div ng-app="ngApp" ng-controller="global">
<a aaa href="http://{{::lan}}/4567">has syntax</a>
<a aaa href="http://nosyntax/4567">no syntax</a>
</div>
angular.module('ngApp',[])
.directive('aaa',function(){
return {
link:function(scope, ele, attr){
attr.$set('href','http://fromdirective');
}
}
}).controller('global',function($scope){
$scope.lan = 'en-gb';
})
答案 0 :(得分:2)
由于您正在利用link
,因此框架已将数据附加到相关元素,解析{{}}
语法(摘要周期)。如果要在之前设置此值,则可以使用compile
代替link
...
.directive('aaa',function(){
return {
compile: function(tElement, tAttributes, transcludeFn) {
// -- just a jqLite object at this point
tAttributes.$set('href','http://fromdirective');
}
}
不确定这是否是你的意图,但这就是它发生的原因。正如其他人所建议的那样,$timeout
也会避免摘要问题,但 link
最初消化后的 - 您需要确定哪个更合适用例。
有关此主题的更多讨论,请参阅问题What is the difference between compile and link function in angularjs。另请查看ngHref directive - 也许这可能很有用。
答案 1 :(得分:1)
这是你在找什么?
angular.module('ngApp',[])
.directive('aaa',['$timeout',function($timeout){
return {
link:function(scope, ele, attr){
$timeout(function() {
attr.$set('href','http://fromdirective');
},0);
}
}
}]).controller('global',function($scope){
$scope.lan = 'en-gb';
})
答案 2 :(得分:1)
使用$timeout
将更改推送到摘要周期结束
angular.module('ngApp',[])
.directive('aaa',function($timeout){
return {
link:function(scope, ele, attr){
$timeout(function(){
attr.$set('href','http://fromdirective');
});
}
}
});