角度js中的识别对象已更改

时间:2014-01-12 14:07:24

标签: javascript jquery angularjs onchange

我有一个后端对象,我从服务器收到并发送到服务器。 我向用户授予更改后端对象的权限。 我想确定后端对象是否已从保存点更改。

我如何识别它?

例如: 我有一个名为

的模块
app.controller('PanelCtrl', function($scope, $http) {
$scope.action = "";
$scope.selectedItem = "";
    $scope.compoundItem = [];

...

我有对象的复合项数组。 我想知道是否有变化是否在基元中发生了变化以及是否在复合项中......

2 个答案:

答案 0 :(得分:9)

编辑:两个场景1)客户端检查(原始帖子)2)服务器检查(根据评论扩展)

1)检查客户端

不要担心以下步骤的执行情况。如果您这样做,请阅读有关效果here

的更多信息

答案是:angular.equals(),此处描述了类似的方案:Developer Guide / forms (它与验证有关)。在绑定到表单和控件状态部分,我们可以看到脚本(提取)

function Controller($scope) {
  $scope.master = {};

  $scope.update = function(user) {
    $scope.master = angular.copy(user);
  };

  $scope.reset = function() {
    $scope.user = angular.copy($scope.master);
  };

  $scope.isUnchanged = function(user) {
    return angular.equals(user, $scope.master);
  };
}

我们在这里看到的是我们所需要的。首先复制源状态(在更新函数内)。我们可以随时更改isUchnaged,同时使用angular.equals()

同时检查Compare objects in Angular

注意:对angular.copy()的注释。我发现,在某些情况下,更好的方法是使用lo-dash .deepClone()

2)服务器端解决方案

如果(正如Dalorzo所期望的那样)在服务器,持久版本和客户端的比较中很有意思。如果我们想检查某个其他是否已经更改了“实体”,那么这是有道理的。在其他一些交易中

通常有很多技术,但最有效的是版本控制。在持久层上,我们必须引入一些值,每次执行“更新”时都会更改/递增。对于MS SQL Server,它将是 rowversion ,请参阅more here

然后,在任何sucesfull UPDATE操作期间,此版本将被更改,并且我们知道客户端上的数据是陈旧的...服务器上有更新的。

版本摘要

我们的检查非常简单:

  • 比较客户端(当前)版本属性和
  • 询问服务器最新的持久性。

这是我与NHiberante(read more here

一起使用的标准方法

答案 1 :(得分:0)

我的第一个解决方案是使用 $timeout(isDifferent,xtime)

其中:

isDifferent =是您的自定义函数,用于获取后端对象或识别它何时发生更改。

xtime = is和整数值(以毫秒为单位),表示函数执行的频率。