gpt4 book ai didi

javascript - MEAN/AngularJS 应用程序检查对象是否已发布

转载 作者:行者123 更新时间:2023-11-30 12:16:40 24 4
gpt4 key购买 nike

我有 angularJS 前端,我在后端使用 express、node 和 mongo。

我的情况是这样的:

//my data to push on server
$scope.things = [{title:"title", other proprieties}, {title:"title", other proprieties}, {title:"title", other proprieties}]

$scope.update = function() {
$scope.things.forEach(function(t) {
Thing.create({
title: t.title,
//other values here
}, function() {
console.log('Thing added');
})
})
};

//where Thing.create its just an $http.post factory

HTML 部分如下所示:

//html part
<button ng-click="update()">Update Thing</button>

然后在同一页面上,用户可以更改 $scope.things 而我的问题是,当我再次调用 update() 时,所有的东西都是发布了两次,因为这就是我正在做的。

谁能解释一下如何检查“事物”是否已经发布到服务器只是为了更新值($http.put),以及它是否没有发布到服务器上到 $http.post。

或者可能是其他方式来做到这一点?

最佳答案

我看到了一些需要做出的决定:

1) 您是否应该在用户点击“更新”按钮后发送请求(就像您目前所做的那样)?还是应该在用户更改事物时发送请求(使用 ngChange)?

2) 如果使用 (1) 的按钮方法,您应该为每个事物发送请求(就像您目前正在做的那样),还是应该首先检查事物是否已更新/新创建前端。

3) 您如何处理一些 Thing 是新创建的而另一些只是更新的事实?多条路线?如果是这样,那么您如何知道将请求发送到哪条路由?同一条路线?怎么办?


1

对我来说,使用“更新”按钮的好处似乎是用户很清楚它是如何工作的。通过单击“更新”(之后可能会看到一条闪现消息),用户知道(并获得视觉反馈)事物已更新。

使用“更新”按钮的代价是可能会发出不必要的请求。网络通信速度很慢,因此如果您有很多 Thing,则为每个 Thing 发出请求可能会非常慢。

最终,这对我来说似乎是用户体验与速度的决定。这取决于情况和目标,但我个人倾向于“更新”按钮。


2

这里的权衡似乎是在代码简单性和性能之间。更简单的解决方案是对每个事物发出请求,无论它是否已更新/新创建(对于以前存在且未更改的事物,不会造成任何伤害 - 它们根本不会被改变) .

更复杂但性能更高的方法是跟踪事物是否已更新/新创建。您可以在 Thing 中添加一个名为 dirty 的标记来跟踪这一点。

  • 当用户点击创建新事物时,新事物将被赋予 dirty: true 标志。
  • 当您查询从数据库中获取所有内容时,它们都应该有 dirty: false(无论您是否要将 dirty 属性存储在数据库中或只需将其附加到服务器/前端由您决定)。
  • 当用户更改现有事物时,dirty 属性将设置为 true

然后,使用 dirty 属性,您只能对 dirty 的事物发出请求:

$scope.things.forEach(function(thing) {
if (thing.dirty) {
// make request
}
});

正确的解决方案取决于您的具体情况,但我倾向于在代码简单性而非性能方面犯错误。


3

如果您使用的是 Mongoose,则 default behavior是向创建的文档添加一个 _id 字段(它也是 default behavior 以及 MongoDB 本身)。因此,如果您没有覆盖此默认行为,并且您没有明确阻止此 _id 字段被发送回客户端,则它应该存在于先前创建的事物中,因此允许您可以将它们与新创建的事物区分开来(因为新创建的事物不会有 _id 字段)。

这样,您就可以有条件地调用 createupdate,如下所示:

$scope.things.forEach(function(thing) {
if (thing._id) {
Thing.update(thing._id, thing);
}
else {
Thing.create(thing);
}
});

或者,您可以使用为您执行“创建或更新”的单个路由。您可以通过在 update 调用中设置 { upsert: true } 来做到这一点。

general , upsert 将检查文档是否符合查询条件...如果匹配,则更新它,如果不匹配,则创建它。在您的情况下,您可能会在 Mongoose 的 findByIdAndUpdate 的上下文中使用 upsert像这样:

Thing.findByIdAndUpdate(id, newThing, { upsert: true }, function(err, doc) {
...
});

参见 this所以发帖。

关于javascript - MEAN/AngularJS 应用程序检查对象是否已发布,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/32264503/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com