在NodeJS中创建一个类似knockoutjs的跟踪器

Creating a KnockoutJS-like tracker in NodeJS

本文关键字:knockoutjs 跟踪 一个 NodeJS 创建      更新时间:2023-09-26

所以我基本上只是试图添加观察者到Javascript的Getter/Setter函数,但还没有运气。

KnockoutJS (http://knockoutjs.com)对.track()进行此操作。

使用track()的YouTube视频示例:
https://www.youtube.com/watch?v=MNiUcuo3Wio

这导致我的第一个问题, __defineGetter____defineSetter__只适用于对象而不是字符串字面值吗?

这里有一个代码示例,说明这是如何理想地工作的,它可能会澄清一些事情。

// Knockout-like tracker in NodeJS.
function track(trackObj, callback) {
  if (!trackObj) return;
  trackObj.__defineCallback__ = callback;
  trackObj.__defineGetter__('value', function() {
    return 'something';
  });
  trackObj.__defineSetter__('value', function() {
    console.log("fn called");
    if (trackObj.__defineCallback__)
      trackObj.__defineCallback__("new value");
  });
}
var something = "track me!";
track(something, function(newValue) {
  console.log("Something has changed to: " + newValue);
});
something = "I have changed."; // Trigger the update callback function.

我创建了一个简单的解决方案,尽管我不是很满意。因此,我暂时不回答这个问题。

缺点之一是您只能跟踪具有相同名称的单个属性。为了解决这个问题,您可以将以下代码放在NodeJS模块中,并为您想要跟踪的每个项目创建一个新的跟踪器对象。这也适用于同名变量。处理所有不同的跟踪器对象可能会让人感到困惑。

var tracker = {};
var trackerValues = {};
function track(trackName, callback) {
  Object.defineProperty(tracker, trackName, {
    set: function(toValue) {
      trackerValues[trackName] = toValue;
      if (callback) callback();
    },
    get: function() {
      return trackerValues[trackName];
    }
  });
}
tracker.something = "track me!";
track("something", function() {
  console.log("Something has changed to: " + tracker.something);
});
track("somethingElse", function() {
  console.log("SomethingElse has changed to: " + tracker.somethingElse);
});
tracker.something = "I have changed.";
tracker.something = "I have changed again!";
tracker.somethingElse = "We can track multiple objects";


还有一个JSBin示例:
http://jsbin.com/bunonaca/1/edit?js,控制台