假设我的应用程序有一个项目列表,用户可以在列表中插入新项目。
Meteor 通常做的是:当用户在列表中插入一个项目时,它会立即出现在他们的浏览器中,而无需等待服务器确认。
我想要的是:当一个项目处于这种状态(已提交但服务器尚未确认)时,它会出现在列表中的正确位置,但显示为灰色。
有没有办法让 Meteor 做到这一点?
假设我的应用程序有一个项目列表,用户可以在列表中插入新项目。
Meteor 通常做的是:当用户在列表中插入一个项目时,它会立即出现在他们的浏览器中,而无需等待服务器确认。
我想要的是:当一个项目处于这种状态(已提交但服务器尚未确认)时,它会出现在列表中的正确位置,但显示为灰色。
有没有办法让 Meteor 做到这一点?
当然。制作一个进行插入的方法。当方法运行时,让它检查它是否在模拟中运行,如果是,在插入的项目上设置一个“临时”或“未确认”标志。使用它来决定是否将项目呈现为灰色。
假设您使用的是 MongoDB:
// Put this in a file that will be loaded on both the client and server
Meteor.methods({
add_item: function (name) {
Items.insert({name: name,
confirmed: !this.isSimulation});
}
});
调用方法:
Meteor.call("add_item", "my item name");
这就是你需要做的。这样做的原因是,一旦服务器完成保存项目,客户端上的本地(模拟)更改将被撤销并替换为服务器上实际发生的任何内容(不包括“未确认”标志。)
以上是最简单的方法,但它会导致数据库中的所有记录都具有“已确认”属性为真。为避免这种情况,请仅在其为 false 时设置确认属性。
有关更多信息,请参阅文档的这一isSimulation
部分Meteor.methods
这就是我在服务器端添加了一个观察者的方法,我从客户端本身创建了一个名为 notify false 的变量,一旦服务器接收到 udpate,它将使 notify 为 true,并且客户端将在同一位置更新。
Collection.find({"notify":false}).observe({
"added" : function(first){
collection.update({"_id":first._id},{$set : {"notify":true}});
}
});