为什么在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。