Angular Binding Getter/Setter
HTML
<link rel="stylesheet" href="http://twitter.github.com/bootstrap/assets/css/bootstrap.css">
<script src="http://code.angularjs.org/1.0.1/angular-1.0.1.js"></script>
<div ng-app="myApp">
<body>
<form name="form">
<input type="text" ng-model="$ngModelValue" ng-model-getter="getValue()" ng-model-setter="setValue($value)"/> {{myDerivedValue}}
<div>
<input type="text" ng-model="myValue" />
<div>
</form>
</body>
</div>
JavaScript
var myApp = angular.module('myApp', []);
myApp.directive(
{
'ngModelGetter': function () {
return {
require: "ngModel",
controller: ctrl,
link: function(scope, element, attrs, ngModelCtrl)
{
var getExpression = attrs.ngModelGetter;
function updateViewValue(newValue, oldValue)
{
if (newValue != ngModelCtrl.$viewValue)
{
ngModelCtrl.$setViewValue(newValue);
ngModelCtrl.$render();
}
var updateExpression = attrs.ngModel + "=" + getExpression;
scope.$eval(updateExpression);
}
updateViewValue();
scope.$watch(getExpression, updateViewValue);
}
};
},
'ngModelSetter': function () {
return {
require: "ngModel",
controller: ctrl,
link: function(scope, element, attrs, ngModelCtrl)
{
var setExpression = attrs.ngModelSetter;
function updateModelValue(e)
{
scope.$value = ngModelCtrl.$viewValue;
scope.$eval(setExpression);
delete scope.$value;
}
scope.$watch(attrs.ngModel, updateModelValue);
}
};
}
});
function ctrl($scope) {
$scope.getValue = function ()
{
return $scope.myValue;
}
$scope.setValue = function (val)
{
$scope.myValue = val;
...