ng-change获得新值和原始值

时间:2014-10-29 00:55:08

标签: angularjs ng-options

我使用ng-options从下拉列表中选择值。我希望能够将旧值与新值进行比较。 ng-change适用于获取下拉的新值,但我如何同时获得新值和原始值?

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

例如,让我们说我想让控制器记录,&#34;你以前的用户名是BILL,你当前的用户名是PHILLIPE。&#34;

7 个答案:

答案 0 :(得分:258)

使用角度{{expression}},您可以将旧用户或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时使用旧的user.id值形成的文字。

答案 1 :(得分:13)

您也可以使用

<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>

答案 2 :(得分:12)

只需在控制器中保留currentValue变量,并在每次更改时更新。然后,您可以在每次更新之前将其与新值进行比较。&#39;

使用手表的想法也很好,但我认为一个简单的变量是最简单和最合理的解决方案。

答案 3 :(得分:12)

您可以使用ng-change = someMethod({{user.id}})之类的内容。 通过将您的值保持在{{expression}}边,它将在线计算表达式并为您提供当前值(在调用ng-change方法之前的值)。

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

答案 4 :(得分:8)

您可以使用示波器手表:

$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

答案 5 :(得分:2)

您可以使用手表,因为它具有旧值和新值,但随后您将添加到摘要周期。

我只是在控制器中保留第二个变量并设置它。

答案 6 :(得分:0)

您可以随时这样做:

... ng-model="file.PLIK_STATUS" ng-change="file.PLIK_STATUS = setFileStatus(file.PLIK_ID,file.PLIK_STATUS,'{{file.PLIK_STATUS}}')" ...

并在控制器中:

$scope.setFileStatus = function (plik_id, new_status, old_status) {
    var answer = confirm('Czy na pewno zmienić status dla pliku ?');
    if (answer) {
        podasysService.setFileStatus(plik_id, new_status).then(function (result) {
            return new_status;
        });
    }else{
        return old_status;
    }
};