用angular.js重置一个模型
我只是试图重置像这样的值:
$scope.initial = [ { data1: 10, data2: 20 } ]; $scope.datas= $scope.initial; $scope.reset = function(){ $scope.datas = $scope.initial; }
但它不产生任何东西,任何想法来解决它?
angular.module('app', []).controller('MyCtrl', function($scope) { $scope.initial = [ { data1: 10, data2: 20 } ]; $scope.datas= $scope.initial; $scope.reset = function(){ $scope.datas = $scope.initial; } });
<script src="https://ajax.googleapis.com/ajax/libs/angularjs/1.2.23/angular.min.js"></script> <div ng-app="app" ng-controller="MyCtrl"> <div ng-repeat="data in datas"> <input type="text" ng-model="data.data1" /> <input type="text" ng-model="data.data2" /> </div> <a ng-click="reset()">Reset to initial value</a> or <button ng-click="name = initial">Reset to initial value</button> <hr /> <p ng-repeat="data in datas">{{data.data1}}, {{data.data2}}</p> </div>
jsfiddle上有一个工作示例
这真的是一个关于JavaScript的问题(所以我添加了“javascript”标签)。 当一个JavaScript对象(比如数组$ scope.initial)被分配给一个variables时,它是通过引用分配的,而不是通过拷贝来分配的。 所以,这个声明
$scope.datas= $scope.initial;
导致$ scope.datas指向$ scope.initial对象。 对$ scope.datas或$ scope.initial所作的任何更改都会影响相同(单个)对象。 由于ng-model用于数据绑定对象元素data1和data2,所以对文本input的任何更改都会改变$ scope.datas引用的对象的data1和data2元素,即$ scope.initial。 要看到这一点,请将以下内容添加到小提琴的HTML中:
<p>{{initial}}</p>
当你改变文本框中的值时,你会看到$ scope.initial也在改变。
@Max提供了一个部分的答案:在复位函数中使用angular.copy()。 但是,您也必须在初始分配中使用angular.copy():
$scope.datas = angular.copy($scope.initial);
更新:
正如@EpokK在他的回答中所示,另一个解决scheme是
angular.copy($scope.initial, $scope.datas);
正如@bekite在他的回答中提到的,@ EpokK的解决scheme不会创build另一个对象。
完整的代码
angular.module('app', []).controller('MyCtrl', function($scope) { $scope.initial = [{ data1: 10, data2: 20 }]; $scope.datas = angular.copy($scope.initial); $scope.reset = function () { $scope.datas = angular.copy($scope.initial); // or // angular.copy($scope.initial, $scope.datas); } });
<script src="https://ajax.googleapis.com/ajax/libs/angularjs/1.2.23/angular.min.js"></script> <div ng-app="app" ng-controller="MyCtrl"> <div ng-repeat="data in datas"> <input type="text" ng-model="data.data1" /> <input type="text" ng-model="data.data2" /> </div> <a ng-click="reset()">Reset to initial value</a> or <hr /> <p ng-repeat="data in datas">{{data.data1}}, {{data.data2}}</p>{{initial}} </div>
尝试更改reset
function使用angular.copy
$scope.reset = function () { $scope.datas = angular.copy($scope.initial); };
@Mark Rajcok:不要误解我的意思,但是我认为
angular.copy($scope.initial, $scope.datas);
不是一个替代语法
$scope.datas = angular.copy($scope.initial);
我理解它的方式:
$scope.datas = angular.copy($scope.initial);
创build一个$ scope.initial的副本,并将引用赋给$ scope.datas。
angular.copy($scope.initial, $scope.datas);
用$ scope.initial值更新$ scope.datas值
查看angularjs文档( http://docs.angularjs.org/api/angular.copy ),并在那里的Return语句
返回如果指定了目标,则为副本或更新的目标。
工作语法:
$scope.reset = function () { angular.copy($scope.initial, $scope.datas); };
API参考 : angular.copy(source[, destination]);
考虑下面的button
- 编辑
- 保存
- 取消
当用户单击编辑和更改数据,然后使用取消button来获取旧数据时,以下是如何实现这一点。
HTML
<div> <button data-ng-click="edit()" data-ng-show="!editing">Edit</button> <button data-ng-click="save()" data-ng-show="editing">Save</button> <button data-ng-click="cancel()" data-ng-show="editing">Cancel</button> </div>
AngularJs
$scope.edit = function () { $scope.editing = true; $scope.copy = angular.copy($scope.data); }; $scope.cancel = function () { $scope.editing = false; $scope.data = $scope.copy; };
参考
- angular.copy
- Orignal Post
我喜欢亚瑟的评论:简洁明了。
我肯定喜欢在开始编辑时复制值,然后在取消/保存时replace参考。
我更喜欢绑定本地副本,而不是原始数据,然后更改保存的最终数据。 这可以防止以后的各种错误,并封装编辑行为。
最终版本将是:
function initValue() { $scope.bound = angular.copy($scope.data); } function setValue() { $scope.data = $scope.bound; } $scope.edit = function () { $scope.editing = true; initValue(); }; $scope.cancel = function () { $scope.editing = false; initValue(); }; $scope.save= function () { $scope.editing = false; setValue(); };
我已经像上面所说的那样保持了备份,但是在使用的时候我还面临着另外一个问题。
我想如果我把它张贴在这里会对别人有帮助
我有个人资料部分代码如下:
var profileBackup ={}; $scope.profileContinue = function() { profileBackup = angular.copy($scope.userData.profile); // profileBackup = $scope.userData.profile; //other code } $scope.profileCancel = function() { $scope.userData.profile = profileBackup; }
但我很惊讶地发现,即使是非范围variables的profileBackup在模型更改时也会更新(我猜在这种情况下返回引用)
然后我改变了我的代码是这样的:
$scope.profileContinue = function() { profileBackup = angular.toJson($scope.userData.profile); // profileBackup = $scope.userData.profile; //other code } $scope.profileCancel = function() { $scope.userData.profile = angular.fromJson(profileBackup); }
请原谅我,如果没有任何意义..