我有一个用例,我们可以在字符串中包含“&”和“>”字符。例如。强生,value > 3
。因此,在对来自服务器的响应进行编码的同时,该值变为“值> 3”。ng-bind
不支持以下内容:value > 3
将为ngBind
呈现,而浏览器呈现的内容与value > 3
相同。
http://jsfiddle.net/HKahG/2/
Ng:bind <div ng-bind="model"></div>
Ng:bind-html <div ng-bind-html="model"></div>
<div> From Div: value > </div>
为什么
ng-bind
中不存在此默认浏览器行为?我不想使用ng-bind-html
(存在值<
的问题,它不是html)或ng-bind-unsafe-html
。我的应用程序具有动态键值字段,这些字段将显示在应用程序的不同部分。因此,与使用
ngBind
相比,使用单独的指令或装饰器来显示所有字符串字段将需要额外的开销。问题:
1)是否有其他无需使用附加指令的相同方法,或者这是处理编码数据的正确方法吗?
2)是否可以覆盖
ng-bind
的行为或默认装饰它? 最佳答案
编辑:请直接进入答案的底部以获得最佳版本;答案是按时间顺序排列的;最后,经过几次迭代,我得到了最佳代码。谢谢。
是。我已经完成了一个非常简单的实现,它使
ng-bind
表现为您想要的。好吧...我不确定这是否正是您想要的,但至少它能满足我的理解。工作提琴:http://jsfiddle.net/93QQM/
这是代码:
module.directive('ngBind', function() {
return {
compile: function(tElement, tAttrs) {
tAttrs.ngBind = 'myBind(' + tAttrs.ngBind + ')';
return {
pre: function(scope) {
scope.myBind = function(text) {
return angular.element('<div>' + text + '</div>').text();
}
}
};
}
}
});
这不完全是“附加指令”-这是“替代ng-bind行为”的方式。它不会添加新指令,而只是扩展了现有ngBind指令的行为。在编译函数中,我们修改
ng-bind
属性的值,并将其包装到函数调用中。这样,我们就可以访问原始模型值,并有机会修改后返回它。我们在预链接阶段通过作用域使该函数可用,因为如果在后链接阶段进行此操作,则该函数仅在ngtind原始ngBind指令从属性检索到值后才可用。为空字符串,因为将找不到该函数)。
myBind
函数简单而智能:它创建一个元素,并将文本(不变)用作元素主体,仅通过text
函数立即进行检索-它将返回内容,就像“浏览器呈现”它一样。这样,您可以像
<div ng-bind="model.content" />
一样照常使用ngBind,但是具有这种修改的行为。改良版
在每个预链接阶段,我们只能将它附加一次到
myBind
,而不是将$rootScope
函数附加到每个应用了ngBind的范围,而是立即将其附加到所有Scope。新的工作提琴:http://jsfiddle.net/EUqP9/
新代码:
module.directive('ngBind', ['$rootScope', function($rootScope) {
$rootScope.myBind = function(text) {
return angular.element('<div>' + text + '</div>').text();
};
return {
compile: function(tElement, tAttrs) {
tAttrs.ngBind = 'myBind(' + tAttrs.ngBind + ')';
}
};
}]);
比以前的版本干净得多!当然,您可以将myBind
函数名称更改为所需的任何其他名称。该功能的“成本”是这样的:将这个简单的功能添加到根范围中-由您决定是否值得。另一个版本
受Chemiv答案的影响...为什么不从任何示波器中删除该功能,而是使其成为过滤器?它也可以。
另一个新的工作提琴:http://jsfiddle.net/hQJaZ/
和新代码:
module.filter('decode', function() {
return function(text) {
return angular.element('<div>' + text + '</div>').text();
};
}).directive('ngBind', function() {
return {
compile: function(tElement, tAttrs) {
tAttrs.ngBind += '|decode';
}
};
});
现在,您可以从菜单中选择三个选项。