我正在编写一个指令(使用 AngularJS 1.2.0-rc2,如果这很重要),它将一个“清除”按钮(想想浏览器为<input type="search">
元素添加的“x”按钮)添加到<input>
.
由于“清除”按钮是从指令中注入的并且是绝对定位的,我想将现有和新添加的“清除”按钮包含在一个必须确保正确定位<input>
“清除”按钮的包装元素中。position: relative
声明的 HTML 如下所示:
<input type="text" id="myField" data-ng-model="someModel" data-search>
到目前为止我的指令:
angular.module('myApp', []).directive('search', function() {
var
clear = angular.element('<a href role="button" class="btn x" style="display:none">×</a>'),
wrapper = angular.element('<div style="position: relative"></div>');
return {
restrict: 'A',
link: function( scope, element, attrs ) {
element.wrap(wrapper.append(clear));
// more code that's not relevant to my question
}
};
});
我最终得到的 HTML 是
<div style="position: relative">
<a href role="button" class="btn x" style="display: none">×</a>
<input type="text" id="myField" data-ng-model="someModel" data-search>
</div>
这就是我所追求的,但我想理想地对这两个新元素进行模板化,并将 DOM 操作从我的link
函数中抽象出来。
我觉得可能有更好的方法来使用replace
/template
和transclude
选项中的一个或两个,但我不确定如何保留和使用源元素(及其所有属性和数据绑定)与这些选项中的任何一个。
另请注意,即使我的示例ng-model
在源元素上定义了,也应视为可选。我还想将指令限制为属性(restrict: 'A'
)。