2016-11-08 9 views
0

私は、モデルの元の値をthis.model.changedまたはthis.model._previousAttributesとし、BackboneJSを使用しました。ボタンをクリックした後、angularJSでモデルの元の値を取得します

角度と同じ機能を使用したいのですが、ng-changeのように1つのテキストのtextFieldではなく、テキストフィールド、チェックボックスでモデルのすべての変更を検出します。

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:私の見解コードの

例は、私は受け入れるボタンをクリックした後、元のモデルを取得したいです。

答えて

2

コントローラのインスタンシエーション時にコピーを作成できます。 $ watchが起動すると、現在のモデルをコピーと比較します。それが違う場合は、コピーから値を取ってください。

1

フォームをお持ちの場合は、元のデータのコピーを保持することをお勧めします。必要に応じて簡単にマスターコピーに戻すことができます。あなたが本当にマスターからの変更のみを取得したい場合

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


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

その後、私は、バックボーンの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-underscoreは偉大な動作するようです。

関連する問題