【问题标题】:Identify object in angular js has changed识别角度js中的对象已更改
【发布时间】:2014-01-31 06:31:21
【问题描述】:

我有一个从服务器接收并发送到服务器的后端对象。 我允许我的用户更改后端对象。 我想确定后端对象是否已从保存点更改。

我如何识别它?

例如: 我有一个名为

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

...

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

【问题讨论】:

标签: javascript jquery angularjs onchange


【解决方案1】:

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

地点:

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

xtime= 是整数值,以毫秒为单位,表示您的函数执行的频率。

【讨论】:

  • 但正如你所描述的,我需要在当前后端对象和保存的对象之间进行比较。但它很大,有很多领域和对象。可以更简单吗?我需要确定是否只有更改...以便确定我是否必须向服务器发送更新请求。
  • IsDifferent 函数可以做任何事情,以使用您认为更有效的代码。
【解决方案2】:

编辑:两种情况1)客户端检查(原帖)2)服务器检查(基于cmets扩展)

1) 检查客户端

不要担心以下步骤的性能。如果你这样做了,请阅读更多关于性能的信息here

答案是:angular.equals(),此处描述了类似的场景:Developer Guide / forms(它是关于验证的)。在Binding to form and control state部分,我们可以看到脚本(摘录)

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 所期望的) 对服务器、持久版本和客户端的比较感兴趣。如果我们想检查是否有人 else 已经更改了“实体”,这可能是有道理的。在其他一些交易

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

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

版本总结

我们的检查可能很容易:

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

这是我与 NHiberante (read more here) 一起使用的标准方式

【讨论】:

  • 尽管 Dalorzo 投了反对票,但我还是建议您检查这些链接。他们来自 AngularJS 文档指南...
  • 为什么这被否决了?怎么了?要比较两个对象,我们可以使用angular.equals
  • @Radim Köhler 否决票是因为您错过了“我想确定后端对象是否已从保存点更改”。我无法理解您上面的代码将如何满足这一点。抱歉,我以为你会注意到的。
  • @Dalorzo,我已经更新了我的答案,将其扩展以解决您对问题出在客户端和服务器之间的期望。这个答案似乎正确吗?
  • @RadimKöhler 不错的答案!
猜你喜欢
  • 1970-01-01
  • 2019-01-20
  • 2019-01-06
  • 1970-01-01
  • 1970-01-01
  • 2021-04-10
  • 2018-09-11
  • 1970-01-01
  • 2023-02-02
相关资源
最近更新 更多