НГ-изменение получить новое значение и исходное значение


Я использую ng-options для выбора значений из выпадающего списка. Я хотел бы иметь возможность сравнить старое значение с новым значением. ng-change хорошо работает для захвата нового значения pull down, но как я могу получить как новое значение, так и исходное значение?

<select ng-change="updateValue(user)" ng-model="user.id" ng-options="user.id as user.name for user in users"></select> 

например, предположим, что я хотел, чтобы контроллер регистрировал: "ваш бывший user.name был Билл, ваше текущее имя пользователя-Филипп."

6 100

6 ответов:

С помощью углового {{выражения}} вы можете добавить старого пользователя или user.id значение атрибута ng-change в виде литеральной строки:

<select ng-change="updateValue(user, '{{user.id}}')" 
        ng-model="user.id" ng-options="user.id as user.name for user in users">
</select>

в ngChange первым аргументом для updateValue будет новое пользовательское значение, вторым аргументом будет литерал, который был сформирован, когда select-tag был в последний раз обновлен angular, со старым user.id ценность.

просто держите переменную currentValue в контроллере, который вы обновляете при каждом изменении. Затем вы можете сравнить это с новым значением каждый раз, прежде чем обновлять его.-

идея использования часов также хороша, но я думаю, что простая переменная является самым простым и логичным решением.

вы можете использовать что-то вроде ng-change=someMethod({{user.id}}). Сохраняя свое значение в стороне {{expression}} , он будет оценивать выражение в строке и дает вам текущее значение(значение перед вызовом метода ng-change).

<select ng-model="selectedValue" ng-change="change(selectedValue, '{{selectedValue}}')">

также вы можете использовать

<select ng-change="updateValue(user, oldValue)"     
       ng-init="oldValue=0"
       ng-focus="oldValue=user.id"
       ng-model="user.id" ng-options="user.id as user.name for user in users">
</select>

вы можете использовать scope watch:

$scope.$watch('user', function(newValue, oldValue) {
  // access new and old value here
  console.log("Your former user.name was "+oldValue.name+", you're current user name is "+newValue.name+".");
});

https://docs.angularjs.org/api/ng/type/$rootScope. Scope#$watch

вы могли бы использовать часы вместо этого, потому что это имеет старое и новое значение, но тогда вы добавляете к циклу дайджеста.

Я бы просто сохранил вторую переменную в контроллере и установил ее.