【踩坑】angularJS 1.X版本中 ng-bind 指令多空格展示

做项目的时候遇到的问题

1、问题描述

  用户在表单某个值输入多个空格,例如:A     B,保存至服务器

  在列表查询页面中使用bg-bind的指令单向绑定,结果展示位A B,连续的空格被替换为单个空格

2、定位分析

  2.1 从用户输入到最终查询展示经理太多环节,可能转换的地方有:  输入时的事件中,请求服务器前,http传输,服务器接收解析,服务器处理,服务器保存至数据库,数据库查询服务,查询服务返回,界面展示

  因此逆向定位问题好些

  通过Chrome中network看到服务器返回的数据带有多个空格,查看html元素,元素代码中是由多个空格,

  初步判定是由于类似html直接赋值给dom元素,html默认会把连续空格展示为1个空格

  2.2 分析代码走向,在angular 1.4.8中 ngBindDirective 代码如下

  这里是采用textContent方法

  textContent的特点在文章下方的参考中已经指出:先将ASCII实体对应的字符(<、>、&、‘和")转换为实体名,然后把处理后的值赋予给innerHTML属性。

var ngBindDirective = [‘$compile‘, function($compile) {
  return {
    restrict: ‘AC‘,
    compile: function ngBindCompile(templateElement) {
      $compile.$$addBindingClass(templateElement);
      return function ngBindLink(scope, element, attr) {
        $compile.$$addBindingInfo(element, attr.ngBind);
        element = element[0];
        scope.$watch(attr.ngBind, function ngBindWatchAction(value) {
          element.textContent = isUndefined(value) ? ‘‘ : value;
        });
      };
    }
  };
}];

3、解决

  3.1 尝试直接替换value中的空格  element.textContent = isUndefined(value) ? ‘‘ : value.replace(/[ ]/g,"&nbsp;");

    &nbsp会被保留在html中,这和以前常用的jquery的html()或者innerHtml不一样

  3.2 替换后的value以innerHtml的方法放到DOM对象中  

    element.textContent = isUndefined(value) ? ‘‘ : value;
    element.innerHTML = (element.textContent + ‘‘).replace(/[ ]/g,"&nbsp;");

    OK ,搞定,这里入戏修改是否合适还不太清除。基于我们项目目前的情况1、严格使用ng-bind,2 使用$sce 3、数据在Service有编码转码处理,目前还没有发现BUG,但是在通用场景下这样改是否合适? 欢迎大家补充

参考:JS魔法堂:被玩坏的innerHTML、innerText、textContent和value属性

时间: 2024-10-24 09:16:07

【踩坑】angularJS 1.X版本中 ng-bind 指令多空格展示的相关文章

cocos creator踩坑日记(持续更新中...)

踩坑一 问题:项目在构建成Web Mobile后运行在浏览器和微信中,点击页面任何地方都会导致自动全屏 解决:在构建之后的main.js中,去掉 cc.view.enableAutoFullScreen(true) 踩坑二 问题:精灵使用move to后路径上会留下一些线条 原因:脏矩形出问题了 解决: Canvas模式下才有脏矩形,使用这个方法之前要判断 if (cc._renderType === cc.game.RENDER_TYPE_CANVAS) { cc.renderer.enabl

每日踩坑 2018-09-29 .Net Core 控制器中读取 Request.Body

测试代码: 结果: PostMan: 代码: 1 private string GetRequestBodyUTF8String() 2 { 3 this.Request.EnableBuffering(); 4 this.Request.Body.Position = 0; 5 Encoding encoding = System.Text.UTF8Encoding.Default; 6 if (this.Request.ContentLength > 0 && this.Requ

gauge自动化框架踩坑(四):在测试报告中自定义messages

在开始之前,我觉得很有必要介绍一下print和logger,因为平时调试用的最多的就是print和看日志,当然可以打断点调试,但是我不太习惯用这个 一. print gauge控制台输出到底支不支持print,其实自己可以写个demo,看来确实是支持的,不过控制台输出的有点乱,几乎和P紧挨着.其实gauge可以对print的结果标记个颜色区分下 二. logging 事实上,并没有任何的输出 gauge的日志做得不太好.它的输出日志是存放在logs/gauge.log下的,这里的日志非常简短,一

maven踩坑总结

maven踩坑 安装 入门级的pom.xml配置 常用命令 maven插件 添加自己的源文件到maven中 使用外部依赖 测试文件的格式 其他内容,各位自取所需 maven踩坑 安装 在环境变量中添加安装包bin目录路径 运行 mvn -v 查看是否安装成功 mvn -h 查看可用的option 入门级的pom.xml配置 <project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w

20191105踩坑记

踩坑之JSP 一 jsp中的注释有严格的分明.对jsp代码进行注释必须使用<%----%>. 二 关键词:List与ArrayLIst 在实际开发中,同样这样创建list: List list = new ArrayList(); 这样创建的好处时:因为list有多个实现类.以后可能会改变list的实现类,这样写的话,只需要修改一行代码就可以了. 三 让servlet在服务器启动时自动加载的方法: 在web.xml中的对应servlet标签下添加:. 四 project中的buildAuto.

《AngularJS权威教程》中关于指令双向数据绑定的理解

在<AngularJS权威教程>中,自定义指令和DOM双向数据绑定有一个在线demo,网址:http://jsbin.com/IteNita/1/edit?html,js,output,具体代码如下: <!doctype html> <html ng-app="myApp"> <head> <script src="https://ajax.googleapis.com/ajax/libs/angularjs/1.2.0-

网站移动版本开发踩坑实录三

鉴于本人在移动wap上的开发经验少,遇到的问题确实不少,很多问题都是为了项目紧急上线而不得已的写临时性的fixed的方案,所以解决方法也存在缺陷,这次记录的虽然没有什么高大上的东西,把几个明显的问题和解决过程记录下来. 1.ios系统浏览器事件会触发两次 问题发现于ipad.iphone上,起初遇到这个问题本以为自己在绑定了两次事件(touchstart click),但是由于最新的ipad对click事件不支持以及为了防止重复绑定事件,因此我特意处理了关于touchstart和click做了一

网站移动版本开发踩坑实录四

前戏:晕晕乎乎正在瞌睡中,测试妹纸拿来一个ipad,开着微博,打开了站点说你看,微博自带浏览器点击放大以后网页没有自适应啊(网站由于有图片神马的,全站图片要自适应各种移动设备),我惊醒,心想我草这是啥功能, 我这种木有ipad的人什么时候看见过这个功能. 好吧既然出问题了,就开始想想吧---继续昏迷10分钟.... 开始:拿着ipad上大概看了一下,当微博打开的时候,其实页面还是有一点冗余的空白宽度,既然做了一个80%(估计)的可视展示区域,但是还是能有用移动留出空白,然后点击放大,页面平铺这个

Android NDK中的C++调试踩坑标记

RT, Android NDK中的C++调试, GDB调试比较麻烦,在ADT Eclipse中: 1.配置好NDK给工程加上Native Support 2.编译中加上NDK_DEBUG=1 3.然后改造下mk文件: #APP_DEBUG will be set by android-ndk if NDK_DEBUG=1 is set. ifdef APP_DEBUG ifeq ($(APP_DEBUG),true) CFLAGS+= -O0 -g LOCAL_CFLAGS+= -D_DEBUG