值& gt 3将呈现为ngBind,而浏览器呈现与值相同的内容> 3。
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的行为还是默认装饰它?
是。我做了一个非常简单的实现,这使得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属性的值,将其包装成一个函数调用。有了这个,我们可以访问原始的模型值,并返回修改的机会。
我们在预链接阶段通过范围使功能可用,因为如果我们在后置链接阶段执行此功能,则只有在原始ngBind指令从属性(将是空字符串,因为函数没有被找到)。
myBind函数是简单而智能的:它创建一个元素,文本被使用 – 不变 – 作为元素体,只能通过文本函数立即检索 – 这将像“浏览器呈现”一样返回内容。
这样,您可以照常使用ngBind,例如< divng-bind =“model.content”/>,但具有此修改的行为。
改良版
我们可以在每个预连接阶段将myBind函数附加到每个应用了ngBind的范围,而不必将它附加到$ rootScope一次,使其立即可用于所有范围。
新工作小提琴: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',tAttrs) { tAttrs.ngBind += '|decode'; } }; });
现在,您可以从菜单中选择三个选项。