清理文本输入的文本

时间:2014-09-18 08:07:56

标签: angularjs angular-directive

我正在使用textangular作为我正在处理的项目的富文本解决方案。

需要清理此输入,因为我们只允许某些html标记。

由于这不是textangular的默认可能性,我创建了一个包含textangular指令的指令。我可以成功清理输入文本,但视图永远不会更新,我已经没有想法如何实现这个

指令:

.directive('chTextAngular',  function(){

    return {
      restrict: 'E',
      require: 'ngModel',
      template: function(elements, attributes) {
        return '<div text-angular ng-model="' + attributes.ngModel + '" id="' + attributes.id + '"></div>';
      },
      link: function(scope, element, attributes, ngModel) {
        scope.$watch(attributes.ngModel, function(n, o) {
          if(n !== undefined) {

            // Replace all the divs with <br> tags
            var sanitized = ngModel.$viewValue.replace(/<div>/gm, '<br>').replace(/<\/div>/gm, ' ');
            sanitized = sanitized.replace(/<p>/gm, '').replace(/<\/p>/gm, '<br><br>');

            sanitized = $.htmlClean(sanitized, {
              allowedTags: ["strong", "em", "ul", "ol", "li", "a", "b", "i", "br"],
              allowedAttributes: ["a", "href"]
            });

            console.log(sanitized);

            ngModel.$setViewValue(sanitized);

          }
        });
      }
    }
});

日志打印出模型,它显示它实际上是变化的。我只是无法弄清楚如何用textangular更新实际的textarea。

任何人都可以帮助我,或者让我朝着正确的方向前进吗?

1 个答案:

答案 0 :(得分:0)

好的,我要问的第一个问题是;你真的需要更新视图吗?如果模型是正确的数据,它是否正常。

其次,您可能应该通过ngModel.$parsers.push(function(n,o){...})注册您的功能,以避免额外的观察者。

它没有更新的原因是我们在textAngular中有一个catch,以防止模型在有人输入时更新视图。如果在该字段聚焦时执行此操作,则会出现光标移回文本字段的开头/结尾的问题。如果您确实要从模型更新视图,请注册模糊事件处理程序(element.on('blur', ...);),并且调用scope.updateTaBindtaTextElement()可能会起作用,具体取决于您的指令附加到哪个范围。如果该功能不起作用,您必须为textAngular元素添加name属性,然后使用textAngularManager.refreshEditor(name);函数。