在Angular.js中使用ngModel中的表达式
Using expressions in ngModel in Angular.js
给出控制器内部的代码:
$scope.entity = {
firstName: 'Jack',
lastName: 'Bauer',
location: {
city: 'New York'
}
};
$scope.path = 'location.city';
如何动态绑定ngModel
到path
指定的entity
的属性?
我试过这样做,但是没有用:
<input ng-model="'entity.' + path">
Slava,我不太确定这是不是一个好主意。但无论如何,您需要通过将此属性添加到您的输入ng-model-options="{ getterSetter: true }
来使您的模型getterSetter意识到。然后你需要在你的控制器中有一个函数,用一个字符串构建一个getterSetter。
<input type="text" ng-model="propertify('entity.' + path)" ng-model-options="{ getterSetter: true }">
这就是最终模板的样子。
幸运的是,angular有一个$parse服务,它让这变得容易得多。所以像这样的东西需要在你的控制器中,或者在注入的服务中更好。
$scope.propertify = function (string) {
var p = $parse(string);
var s = p.assign;
return function(newVal) {
if (newVal) {
s($scope,newVal);
}
return p($scope);
} ;
};
将返回一个getter-setter函数,该函数将为您处理此操作。
更新
不像预期的那样工作,值显示正确,但无法更改。Sander在这里提供了正确的解决方案。
<标题>错误的解决方案
哇,不小心解决了:
<input type="text" ng-model="$eval('entity.' + path)">
这是Plunk。
我希望它能帮助到别人。
标题>如果希望绑定到嵌套属性,可以稍微修改一下括号符号。你必须分割路径到属性:
<input ng-model="entity[locationKey][cityKey]"/>
控制器:
$scope.locationKey = 'location';
$scope.cityKey = 'city';
参见js fiddle
在阅读和使用Sander Elias的答案后,我正在使用这个,但遇到了另一个问题。
当将他的结果与<input>
中的ng-required="true"
合并时,您不能清空字段,因为当字段为空时,newVal
被传递为undefined
。
经过更多的研究,我在GitHub上发现了一个解决这个问题的问题。
Sander的答案和GitHub的答案是这样的:
$scope.propertify = function (string) {
var property = $parse(string);
var propAssign = property.assign;
return function (newVal) {
if (arguments.length) {
newVal = angular.isDefined(newVal)? newVal : '';
propAssign($scope, newVal);
}
return property($scope);
};
};
argument.length
反映了传递给getter/setter的值的数量,在get上是0
,在set上是1
。
除此之外,我添加了angular.isDefined()
作为Sumit在评论中建议的,也保存false
和空(""
)值。
这是一个更新的Plunker
- java.net和javascript之间正则表达式的差异
- Grunt匹配正则表达式
- 不同浏览器中的空白字符正则表达式行为
- ng init中的表达式无法使用ng repeat
- 正则表达式在字符串中找到base64
- 我的AngularJS表达式没有'不起作用
- 子字符串/正则表达式以获取字符串中保存的 SRC 值
- 调用正则表达式匹配的函数
- 表达式引擎扩展开发-向呈现的条目添加自定义javascript
- 使用正则表达式评估电子邮件地址时出现性能问题
- Javascript 正则表达式 : ^[^/s/]+[a-z]{1,}[0-9]*[-_]*[^/][
- JavaScript正则表达式文本与RegExp对象
- 正则表达式只允许 x 个整数
- 使用正则表达式将输入格式设置为单字符逗号、单字符逗号等
- 改进用于验证付款金额的正则表达式
- 正则表达式与数字中的第二个点匹配
- 如何将ngrepeat下的ngmodel绑定到$scope
- 获取:错误:ngModel:nonassign不可分配表达式
- 在Angular.js中使用ngModel中的表达式
- 错误:ngModel:不可分配的表达式