单击按钮后使用 angularJS 获取模型的原始值

Get original values of the model with angularJS after clicking on button

我曾经使用 this.model.changedthis.model._previousAttributes 使用 BackboneJS 获取模型的原始值。

我想使用与 angular 相同的功能,通过检测文本字段、复选框设置的模型中的所有更改,而不是像 ng-change 的情况那样在一个文本文本字段中进行检测。

我试图在 form 的 div 中使用它,但没有成功。

我也试过用:

 $scope.policyL = savingsDraft.fromServer();
    $scope.$watch('policyL', function (oldV, newV) {
 });

但是也没用。

我的视图代码示例:

form(role='form', ng-change='changed (policy, newP)' novalidate)
  .row
    .col-sm-4.form-group
      label.control-label Taux de rendement
      input.form-control(type='number',
        min=0,
        max=1,
        ng-model='policy.admin.depEarnRate')
    .col-sm-4.form-group
      label.control-label Frais de contrat
      input.form-control(type='number',
        min=0,
        ng-model='policy.admin.feesIni')

在我的控制器中:

$scope.accept = function () {
     $scope.change = function();
};

PS: 我想在点击接受后得到原模型

好吧,您可以在控制器实例化时复制一份。然后,每当触发 $watch 时,将当前模型与副本进行比较。如果不同,从副本中取值。

当您有表格时,最好保留一份原始数据的副本。如果需要,您可以轻松地重置回主副本。

$scope.master = dataModel;
$scope.dataModel = angular.copy($scope.master);


$scope.reset = function () {
    $scope.dataModel = angular.copy($scope.master);
    $scope.yourForm.$setPristine();
};

然后,如果您真的只想从 master 那里获得更改,我采用了 Backbone 的 changedAttributes 函数并对其进行了修改以适用于我们这里的案例。

var changedAttributes = function(master, diff) {
    if (!diff) return false;
    var changed = {};
    for (var attr in diff) {
        var val = diff[attr];
        if (!_.isEqual(master[attr], val)) changed[attr] = val;
    }
    return _.size(changed) ? changed : false;
},

要使用这个:

var changes = changedAttributes($scope.master, $scope.dataModel);
if (changes) console.log("dataModel is different from master");

要在 angular 应用程序中包含下划线,angular-underscore 似乎效果很好。