gpt4 book ai didi

angularjs - 当replace=true时如何防止angular指令中的重复属性

转载 作者:行者123 更新时间:2023-12-03 08:14:46 25 4
gpt4 key购买 nike

我发现指定 replace: true 的 Angular 指令将指令用法中的属性复制到模板呈现的输出中。如果模板包含相同的属性,则模板属性值和指令属性值将在最终输出中组合在一起。

指令用法:

<foo bar="one" baz="two"></foo>

指示:
.directive('foo', function() {
return {
restrict: 'E',
replace: true,
template: '<div bar="{{bar}}" baz="baz"></div>',
scope: {
bar: '@'
},
link: function(scope, element, attrs, parentCtrl) {
scope.bar = scope.bar || 'bar';
}
};
})

输出:
<div bar="one " baz="two baz" class="ng-isolate-scope"></div>
bar="one "中的空间导致问题,就像 baz 中的多个值一样.有没有办法改变这种行为?我意识到我可以在指令中使用非冲突属性,并在输出中同时具有模板属性和非冲突属性。但我希望能够使用相同的属性名称,并更好地控制模板的输出。

我想我可以使用 link方法与 element.removeAttr()element.attr() .似乎应该有更好的解决方案。

最后,我意识到有人在谈论弃用 remove: true ,但有正当理由保留它。就我而言,我需要它用于使用嵌入生成 SVG 标签的指令。详情请看这里:
https://github.com/angular/angular.js/commit/eec6394a342fb92fba5270eee11c83f1d895e9fb

最佳答案

不,没有一些很好的声明方式来告诉 Angular 如何 x移植到模板中时,应合并或操作属性。

Angular 实际上将属性从源元素直接复制到目标元素(有一些异常(exception))并合并属性值。您可以在 mergeTemplateAttributes 中看到这种行为。 Angular 编译器的功能。

由于您无法更改该行为,因此您可以使用 compile 对属性及其值进行一些控制。或 link指令定义的属性。在编译阶段而不是链接阶段进行属性操作很可能更有意义,因为您希望这些属性在任何链接函数运行时“准备好”。

你可以这样做:

.directive('foo', function() {
return {
// ..
compile: compile
// ..
};

function compile(tElement, tAttrs) {
// destination element you want to manipulate attrs on
var destEl = tElement.find(...);

angular.forEach(tAttrs, function (value, key) {
manipulateAttr(tElement, destEl, key);
})

var postLinkFn = function(scope, element, attrs) {
// your link function
// ...
}

return postLinkFn;
}

function manipulateAttr(src, dest, attrName) {
// do your manipulation
// ...
}
})

关于angularjs - 当replace=true时如何防止angular指令中的重复属性,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/27075750/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com