我正在开发一个Salesforce项目,我正考虑将Angular JS用于其超级英雄功能。 Salesforce前缀表示名称和id等属性以及动态ID。
例如,如果表单属性 名称 为 customer_registration
,则它变为 i10_j30:customer_registration
当表单的name属性具有特殊字符时,Angular会抛出错误,':'就我而言。
我有以下问题。
答案 0 :(得分:2)
由于94533e57,表单元素的name属性现在只能包含可以作为Angular表达式的一部分进行求值的字符。这是因为Angular使用name的值作为可赋值表达式来设置$scope
上的表单。例如,name="myForm"
将表单分配给$scope.myForm
,name="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);
}
}
};
});
建议的解决方法是创建自定义表单指令。