Giving the code inside of my controller:
$scope.entity = {
firstName: 'Jack',
lastName: 'Bauer',
location: {
city: 'New York'
}
};
$scope.path = 'location.city';
How do I dynamically bind ngModel
to the property of the entity
specified by path
?
I've tried something like this, but to no avail:
<input ng-model="'entity.' + path">
After reading and using Sander Elias' answer, I was using this, but ran into another problem.
When combining his result with ng-required="true"
in the <input>
you could not empty the field, because when the field would be empty, the newVal
is passed as undefined
.
After some more research, I found an isssue on GitHub that addresses and solves this problem.
Here is what Sander's and the GitHub answer combined look like:
$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);
};
};
The argument.length
reflects the number of values that are passed to the getter/setter and will be 0
on a get and 1
on a set.
Besided that, I added the angular.isDefined()
as Sumit suggested in a comment to also save false
and empty (""
) values.
Here is an updated Plunker
Slava, I'm not too sure if this is a good idea to begin with. But anyhow,
You need to make your model getterSetter aware by adding this property to your input ng-model-options="{ getterSetter: true }
.
Then you need a function in your controller that builds a getterSetter out of a sting.
<input type="text" ng-model="propertify('entity.' + path)" ng-model-options="{ getterSetter: true }">
That's how the resulting template would look.
Luckily angular has an $parse service that makes this a lot easier. so something like this would need to be in your controller, or even better in a injected service.
$scope.propertify = function (string) {
var p = $parse(string);
var s = p.assign;
return function(newVal) {
if (newVal) {
s($scope,newVal);
}
return p($scope);
} ;
};
That will return a getter-setter function that handles this for you. see it in action in this plunk
If you love us? You can donate to us via Paypal or buy me a coffee so we can maintain and grow! Thank you!
Donate Us With