如果html' name'表单标记上的属性具有特殊字符,':'在我的情况下

时间:2016-11-28 14:44:53

标签: javascript angularjs salesforce

我正在开发一个Salesforce项目,我正考虑将Angular JS用于其超级英雄功能。 Salesforce前缀表示名称和id等属性以及动态ID。 例如,如果表单属性 名称 customer_registration ,则它变为 i10_j30:customer_registration

当表单的name属性具有特殊字符时,Angular会抛出错误,':'就我而言。

我有以下问题。

  1. 为什么Angular不允许使用':'如果浏览器允许,则使用表单名称
  2. 此问题的可能解决方法是什么。

2 个答案:

答案 0 :(得分:2)

AngularJS Developer Guide -- Migrating from 1.3 to 1.4

表格

由于94533e57,表单元素的name属性现在只能包含可以作为Angular表达式的一部分进行求值的字符。这是因为Angular使用name的值作为可赋值表达式来设置$scope上的表单。例如,name="myForm"将表单分配给$scope.myFormname="myObj.myForm"将表单分配给$scope.myObj.myForm

以前,也可以使用name="my:name"这样的名称,因为Angular对表单名称使用了特殊的setter函数。现在使用通用的,更健壮的$parse setter。

迁移代码的最简单方法是从name属性中删除所有特殊字符。

如果需要保留特殊字符,可以使用以下指令,该指令将使用可在编译函数中作为表达式求值的值替换名称,然后在postLink中重新设置原始名称功能。这确保了(1),表单在作用域上发布,以及(2),表单具有原始名称,如果您正在进行服务器端表单提交,这可能很重要。

angular.module('myApp').directive('form', function() {
  return {
    restrict: 'E',
    priority: 1000,
    compile: function(element, attrs) {
      var unsupportedCharacter = ':'; // change accordingly
      var originalName = attrs.name;
      if (attrs.name && attrs.name.indexOf(unsupportedCharacter) > 0) {
        attrs.$set('name', 'this["' + originalName + '"]');
      }

      return postLinkFunction(scope, element) {
        // Don't trigger $observers
        element.setAttribute('name', originalName);
      }
    }
  };
});

答案 1 :(得分:1)

是':'您尝试按名称访问表单元素时可能会产生问题。

以下链接有相同的讨论,

https://github.com/angular/angular.js/issues/13771

.directive('form', function() {
  return {
    restrict: 'E',
    priority: 1000,
    compile: function(element, attrs) {
      if (attrs.name && attrs.name.indexOf(':') > 0) {
        attrs.$set('name', 'this["' + attrs.name + '"]');
        console.log(attrs);
      }
    }
  };
});

建议的解决方法是创建自定义表单指令。

http://plnkr.co/edit/414QyUt32eZ129kJeJik?p=preview

http://plnkr.co/edit/VuHgBr5EQHTLJrk0HEVC?p=preview