【问题标题】:Trigger event when an object's property changes当对象的属性发生变化时触发事件
【发布时间】:2016-01-04 23:51:42
【问题描述】:

不确定正确的术语,但我正在使用 NodeJS 和 Mongoose 中的一些 API。我有一堆 Mongoose 记录,其中加载了来自 Google Maps API 的数据,我想为每条记录创建一个侦听器,以便在填充特定字段时进行观察。

我不能通过简单的回调来做到这一点,因为 API 受到速率限制并且需要间隔排队系统。

相反,我想要类似的东西:

 var obj1 = {name: 'rec1', mapData: {}, fieldData: {} };
 obj1.on('mapDataComplete', function(){...});

obj1.mapData 从其初始状态更改时发出 mapDataComplete

【问题讨论】:

  • 听起来你真正需要的是来自 MongoDB 的河流。有几种可用的,因为当 Mongo 中的记录更新时,河流通常用于自动更新 ElasticSearch 之类的东西。
  • 一个想法是使用 Object.defineProperty 并覆盖 set 方法来调用你的方法。所以当你做 obj1.mapData = 'whatever' 它应该通过你的 set 方法。我认为一些像 vue.js 这样的前端框架使用它来进行数据绑定。

标签: javascript node.js event-handling dom-events


【解决方案1】:

您正在寻找的是 Object.observe。

var obj1 = {name: 'rec1', mapData: {}, fieldData: {} }; Object.observe(obj1, function(change){...});

见:https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Object/observe

【讨论】:

【解决方案2】:

我也在寻找同样的东西。 现在使用 WatchJS 对我来说很好。

//defining our object however we like
var ex3 = {
    attr1: 0,
    attr2: "initial value of attr2",
    attr3: ["a", 3, null]
};

//defining a 'watcher' for the object

watch(ex3, function(){
    alert("some attribute of ex3 changes!");
});

//when changing one of the attributes of the object the watcher will be invoked
ex3.attr3.push("new value");​

如果我必须自己实现它(我不知道 WatchJS 是如何工作的),我可能会用“setter”和“getter”来包装 pojo 的属性。

如果一个属性是一个数组,我会把它包装成 splice、concat、push 等。 并让每一个触发事件..

一开始可能听起来需要做很多工作,但我相信您可以很快看到结果。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2023-04-02
    • 2011-01-15
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-02-03
    • 2018-03-30
    相关资源
    最近更新 更多