将代码提供给我的控制器:
$scope.entity = {
firstName: 'Jack',
lastName: 'Bauer',
location: {
city: 'New York'
}
};
$scope.path = 'location.city';
如何将ngModel
动态绑定到entity
指定的path
的属性?
我尝试过类似的东西,但无济于事:
<input ng-model="'entity.' + path">
答案 0 :(得分:7)
它没有按预期工作,值正确显示,但无法更改。 Sander here提供了正确的解决方案。
<input type="text" ng-model="$eval('entity.' + path)">
这是Plunk。
我希望它会帮助别人。
答案 1 :(得分:7)
ng-model-options="{ getterSetter: true }
来使模型感知getterSetter。
然后,您需要在控制器中使用一个函数来从sting中构建一个getterSetter。
<input type="text" ng-model="propertify('entity.' + path)" ng-model-options="{ getterSetter: true }">
结果模板的外观如何。
Luckily 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函数,为您处理此问题。 在this plunk
中查看它的实际效果答案 2 :(得分:2)
您可以使用括号表示法进行一些修改,因为您希望绑定到嵌套属性。您必须将路径拆分为属性:
<input ng-model="entity[locationKey][cityKey]"/>
控制器:
$scope.locationKey = 'location';
$scope.cityKey = 'city';
参见 js fiddle
答案 3 :(得分:1)
在阅读并使用Sander Elias的回答后,我正在使用它,但遇到了另一个问题。
将结果与ng-required="true"
中的<input>
结合使用时,您无法清空该字段,因为当该字段为空时,newVal
将作为undefined
传递。
经过一些研究,我发现an isssue on 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
上为1
。
除此之外,我还将angular.isDefined()
添加为Sumit suggested in a comment以保存false
和空(""
)值。