Angular ng - изменение входного текстового поля со старым значением

<input type="text" id="exampleab"
ng-model="a.b"
ui-event="{ blur : 'callScriptThenServer()' }" >

По некоторым причинам текстовое поле ng-change не работает, поэтому я его использую; Используя Angular -ui ui-events.

ПРОБЛЕМА

Я хочу вызвать функцию только в том случае, если значение изменено и также требуется старое значение в обратном вызове. (поскольку я хочу отправить oldValue на сервер).

Я не хочу идти по пути чистых директив, потому что так много вхождений этих

NG-CHANGE: при каждом изменении символа я получаю обратный вызов. Я не хочу этого. Мне нужно вызвать сервер script.. со старым значением в текстовом поле и новым значением после размытия

Ответ 1

Вы можете смотреть, как ваша переменная имеет значение newValue и oldValue одновременно.

<input type="text" id="exampleab" ng-model="a.b"  >

В вашем контроллере:

app.controller('ctrl', function ($scope) {
    $scope.$watch('a.b', function (newValue, oldValue) {
        console.log('oldValue=' + oldValue);
        console.log('newValue=' + newValue);
        //do something
    });
});

JSFiddle

ИЗМЕНИТЬ Вы упомянули новое требование в своем редактировании, чтобы изменить свой ответ. Вы не должны использовать ng-change. вы должны получить oldValue, когда элемент управления будет сфокусирован, и сохраните его в переменной, а затем получите новое значение при событии размытия. Я установил новую скрипту.

В вашем контроллере:

    app.controller('ctrl', function ($scope) {
        $scope.showValues = function () {
            alert('oldValue = ' + $scope.oldValue);
            alert('newValue = ' + $scope.a.b);
        }
    });

Я ваш взгляд

<input type="text" id="exampleab" ng-model="a.b" ng-init="oldValue = ''" ng-focus="oldValue = a.b" ng-blur="showValues()" />{{a.b}}

Ответ 2

Используйте опции ng-model

<input type="text" ng-model="a.b" ng-change="callScriptThenServer()" ng-model-options="{updateOn: 'blur'}"/>

Ответ 3

Вы можете использовать Часы AngularJS

$scope.$watch(function(){
    return $scope.a.b;
}, function(newvalue, oldvalue){
    //Here You have both newvalue & oldvalue
    alert("newvalue: " + newvalue);
    alert("oldvalue: " + oldvalue);
},true);

Plunkr DEMO

Ответ 4

Использовать Angular ngModelOptions с getterSetter: true; а затем используйте вызов метода внутри "установленной" части функции.

См. последний пример на этой странице: https://docs.angularjs.org/api/ng/directive/ngModelOptions