我有一个用例,我们可以在字符串中包含“&”和“>”字符。例如。强生,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 &gt; </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属性的值,并将其包装到函数调用中。这样,我们就可以访问原始模型值,并有机会修改后返回它。
    我们在预链接阶段通过作用域使该函数可用,因为如果在后链接阶段进行此操作,则该函数仅在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';
            }
        };
    });
    
    现在,您可以从菜单中选择三个选项。

    10-08 16:31