Ответ 1
Вы можете добавить директиву ng-change
в поля ввода. Взгляните на документ .
Я пытаюсь построить простой калькулятор в Angular, в котором я могу переопределить общее количество, если захочу. У меня есть эта часть, но когда я возвращаюсь назад, чтобы ввести число в полях один или два, общее количество не обновляется в поле.
Вот мой jsfiddle http://jsfiddle.net/YUza7/2/
Форма
<div ng-app>
<h2>Calculate</h2>
<div ng-controller="TodoCtrl">
<form>
<li>Number 1: <input type="text" ng-model="one">
<li>Number 2: <input type="text" ng-model="two">
<li>Total <input type="text" value="{{total()}}">
{{total()}}
</form>
</div>
</div>
javascript
function TodoCtrl($scope) {
$scope.total = function(){
return $scope.one * $scope.two;
};
}
Вы можете добавить директиву ng-change
в поля ввода. Взгляните на документ .
Я предполагаю, что когда вы вводите значение в поле итогов, выражение значения каким-то образом перезаписывается.
Однако вы можете воспользоваться альтернативным подходом: создать поле для общего значения, а при изменении one
или two
обновить это поле.
<li>Total <input type="text" ng-model="total">{{total}}</li>
И измените javascript:
function TodoCtrl($scope) {
$scope.$watch('one * two', function (value) {
$scope.total = value;
});
}
Пример скрипта здесь.
Я написал директиву, которую вы можете использовать для привязки ng-модели к любому выражению, которое вы хотите. Всякий раз, когда выражение изменяется, модель устанавливается в новое значение.
module.directive('boundModel', function() {
return {
require: 'ngModel',
link: function(scope, elem, attrs, ngModel) {
var boundModel$watcher = scope.$watch(attrs.boundModel, function(newValue, oldValue) {
if(newValue != oldValue) {
ngModel.$setViewValue(newValue);
ngModel.$render();
}
});
// When $destroy is fired stop watching the change.
// If you don't, and you come back on your state
// you'll have two watcher watching the same properties
scope.$on('$destroy', function() {
boundModel$watcher();
});
}
});
Вы можете использовать его в своих шаблонах, например:
<li>Total<input type="text" ng-model="total" bound-model="one * two"></li>
Вам просто нужно исправить формат вашего html
<form>
<li>Number 1: <input type="text" ng-model="one"/> </li>
<li>Number 2: <input type="text" ng-model="two"/> </li>
<li>Total <input type="text" value="{{total()}}"/> </li>
{{total()}}
</form>
Создайте директиву и поставьте на нее часы.
app.directive("myApp", function(){
link:function(scope){
function:getTotal(){
..do your maths here
}
scope.$watch('one', getTotals());
scope.$watch('two', getTotals());
}
})