javascript - 如果表单标签上的 html 'name' 属性具有特殊字符,Angular 会抛出错误,在我的例子中为 ':'

标签 javascript angularjs salesforce

我正在开发一个 Salesforce 项目,我正在考虑使用 Angular JS 来实现它的 super 功能。 Salesforce 使用动态 ID 作为名称和 ID 等表单属性的前缀。 例如,如果表单属性 namecustomer_registration,则它将变为 i10_j30:customer_registration

当表单的名称属性包含特殊字符(在我的例子中为“:”)时,Angular 会抛出错误。

我有以下问题。

  1. 如果浏览器允许,为什么 Angular 不允许在表单名称中使用“:”。
  2. 有哪些可能的解决方法可以解决此问题。

最佳答案

AngularJS Developer Guide -- Migrating from 1.3 to 1.4

表格

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

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

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

如果需要保留特殊字符,可以使用以下指令,该指令会将名称替换为可以在编译函数中计算为表达式的值,然后在 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);
      }
    }
  };
});

关于javascript - 如果表单标签上的 html 'name' 属性具有特殊字符,Angular 会抛出错误,在我的例子中为 ':',我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/40847010/

相关文章:

javascript - 获取显示字段中的值 Ext JS 5

javascript - Angular 在我的 route 没有调用解析

javascript - 我应该把用于 Angular 路由的 html 文件放在哪里?

SalesForce:用户具有读取权限的查询对象

ant - 尝试使用 Force.com 迁移工具 (ANT) 进行部署时我做错了什么

javascript - 如何从javascript中的普通文本获取src值

angularjs - 在 WKWebView 中托管的本地 AngularJS 应用程序

javascript - AngularJS $q 与 socket.io 的 promise

android - 混合应用程序在 Android Studio 中崩溃,错误为 : Session 'android' : Error Launching activity

javascript - 标记用户何时开始在表单中输入