【发布时间】:2014-01-09 01:53:28
【问题描述】:
我整理了一个plunker,最能说明我的问题。
我正在尝试编写一个简单的指令,该指令将从指令中更新嵌入的 html。
例如我想要:
<make-bold>Foo *bar* {{something}}</make-bold>
生成成
<span>Foo <b>bar</b> somevalue<span>
plunker 上的示例运行良好,但我不知道如何获取嵌入内容更改的通知(观看)。在示例中,尝试选择不同的项目(通过单击它们),您会注意到“已处理”没有更新。
我很确定问题是传递给链接函数的元素没有更新,而是内容更新,因此无法观看。
指令
app.directive('makeBold', function($interpolate, $timeout, $compile)
{
var regex = new RegExp("\\*(.+?)\\*", 'g');
var replace = "<b>$1</b>";
return {
restrict: 'E',
transclude: true,
replace: true,
template: '<span ng-transclude></span>',
link: function (scope, element, attrs)
{
scope.$watch(
function() {
// *** What do I need to watch here? ***
return element;
},
function(n, o) {
var text = $interpolate(element.text())(scope);
var newContent = text.replace(regex, replace);
$timeout(function() { element.html(newContent); });
});
}
};
});
模板
<div ng-show="selected">
<h1>{{selected.name}}</h1>
<p><i>Original:</i> {{selected.detail}}</p>
<p><i>Processed:</i> <make-bold>{{selected.detail}}</make-bold></p>
</div>
(注意:我实际上并不想制作“make-bold”指令,但这说明了我遇到的问题。)
【问题讨论】:
-
所以你想得到你的 HTML 显示的文本然后重新插入它?
-
@blesh 我的结论是没有重新插值的好方法。如果默认插值行为不适合用例,那么正确的方法是禁用它并手动使用 $interpolate 和 $watch。在内部,默认行为本身是一个指令 (addTextInterpolateDirective)。
-
@blesh,正确。如果我观看 element.text(),我可以得到这种工作,但在执行“粗体格式”后它会再次触发,所以第二次它最终会剥离它。
标签: javascript angularjs angularjs-directive