为什么在AngularJS中不推荐使用replace?
根据API文档 ,指令的replace
属性已被弃用,所以将来所有的指令都会以当前默认的replace: false
。
这就消除了开发人员replace元素指令元素的能力,而没有明显的替代这个function。
有关如何使用元素指令以及不使用replace: true
的示例,请参阅此plunk replace: true
。
为什么这个有用的属性被弃用,没有更换?
UPDATE
其中一位合作者表示不会被删除,但已知的错误不会被修复。 https://github.com/angular/angular.js/commit/eec6394a342fb92fba5270eee11c83f1d895e9fb#commitcomment-8124407
原版的
这是这个变化的承诺: https : //github.com/angular/angular.js/commit/eec6394a342fb92fba5270eee11c83f1d895e9fb
用于定义replace它们所在元素的
replace
标志将在下一个主要angular度版本中被删除。 这个特性具有困难的语义(例如,如何合并属性),并导致更多的问题相比,它解决了什么。 另外,使用WebComponents,在DOM中定制元素是正常的。
在我看来,它似乎是维持支持的复杂性与效益的结合。
显然,开发人员使用它的一个原因是因为他们首选注入语义正确的标记,因此取代了自定义指令标记。
阅读下面的链接评论,显然很多人希望留下来。
如果担心replace: true
会在下个版本中被删除,则可以使用postCompile
函数来复制该行为。
/// Replace element with it's first child Utils.replaceWithChild = function(element) { var child = angular.element(element[0].firstChild); Utils.mergeAttributes(element, child); element.replaceWith(child); } /// Copy attributes from sourceElement to targetElement, merging their values if the attribute is already present Utils.mergeAttributes = function(sourceElement, targetElement) { var arr = sourceElement[0].attributes; for(var i = 0; i < arr.length; i++) { var item = arr[i]; if(!item.specified) continue; var key = item.name; var sourceVal = item.value; var targetVal = targetElement.attr(key); if(sourceVal === targetVal) continue; var newVal = targetVal === undefined ? sourceVal : sourceVal + ' ' + targetVal; targetElement.attr(key, newVal); } } angular.module('test') .directive('unwrap', function() { return { restrict: 'AE', templateUrl: 'unwrap.part.html', compile: function() { return function postCompile(scope, element, attr) { Utils.replaceWithChild(element); }; } }; });
从GitHub:
Caitp–它被弃用了,因为有一个已知的非常愚蠢的
replace: true
问题replace: true
,其中的一些问题不能真正以合理的方式被修复。 如果你小心避免这些问题,那么给你更多的权力,但为了新用户的利益,只要告诉他们“这会让你头痛,不要做”。
– AngularJS问题#7636
replace:true
被弃用
从文档:
replace
([DEPRECATED!])将在下一个主要版本中被移除 – 即v2.0)指定模板应该replace的内容。 默认为
false
。
true
– 模板将replace指令的元素。false
– 模板将replace指令元素的内容。
– AngularJS综合指令API
我会说这是一件好事,因为它阻止了你将一个指令(组件)的内部运行暴露给外部世界,所以它已经被删除了。 看看你的模板是一个影子DOM,并将你的指令与普通的HTML元素(比如button)进行比较。当你hover或者点击它们时,你不会看到所有正在添加的类和样式应用于这些元素。 这一切都隐藏在里面。 由于目前对影子DOM的支持有所限制,这是一种解决方法,但它已经使您能够成为未来的certificate。