使用MutationObserver收听更改吗?

时间:2018-09-30 07:45:00

标签: javascript

我有一个脚本,该脚本使用active_votes = Vote.objects.filter(votes_to_win__gt=Max('voteforcharacter__votes_number'))检查某些对象状态,但这会导致一些延迟,我想知道是否可以使用 var options = { chart: { style: { fontFamily: 'arial' }, height: 300, events: { drilldown: function (e) { generateDrillDownJSON(e, false); }, drillup: function (e) { generateDrillDownJSON(e, true); } } }, title: { text: Var_ChartTitleText, }, subtitle: { text: Var_ChartSubtitleText, }, tooltip: { formatter: function () { return this.point.name + ' : ' + this.y + ' %'; } }, xAxis: { categories: true }, drilldown: Var_drilldown, legend: { enabled: true }, plotOptions: { allowhtml: true, series: { dataLabels: { enabled: true, formatter: function () { return this.point.name + ' : ' + this.y + ' %'; } }, useHTML: true, shadow: true }, pie: { size: '100%', showInLegend: true } }, series: Var_Series };

我的setInterval

MutationObserver

我的观察者尝试:

setInterval

可以做到吗?

2 个答案:

答案 0 :(得分:1)

由于您的对象似乎不是DOM节点,因此MutationObserver在这里无济于事。但是,您可以使用getters / settersproxy objects轻松实现某种对象观察。一个简单的例子:

var playerInfo = {
  set health(newValue) {
    this._health = newValue;
    if (this.onhealthchange) {
      this.onhealthchange(newValue);
    }
  },

  get health() {
    return this._health;
  }
};

playerInfo.onhealthchange = function(newValue) {
  console.info("Health changed: " + newValue);
};

playerInfo.health = 4;

答案 1 :(得分:1)

我建议使用setter和getter(正如我在注释中所写,MutationObserver仅用于Node对象)。而且由于我从您的代码中假定的属性可能具有各种类型(对象,字符串等),所以我建议使用lodash isEqual方法-它接受数组,对象,字符串,数字等,因此您不必无需为每种类型编写比较功能。功能非常方便。

您也只能安装this particular function

我在这里创建了一个函数,您可以在其中传递对象和属性名称以查看更改:

var isEqual = require('lodash.isequal');

function watchChanges(object, prop, primaryValue) {
  object[`_${prop}`] = primaryValue;
  Object.defineProperty(object, prop, {
   get() { return object[`_${prop}`] },
   set(newValue) { 
    if ( !isEqual(object[`_${prop}`] , newValue)) {
      console.log('change maded in prop')
    }
    object[`_${prop}`] = newValue;
    },
  });
}

要检查发生了什么,以下是原始类型的等效函数:

function watchChanges(object, prop, defaultValue) {
  object[`_${prop}`] = defaultValue;
  Object.defineProperty(object, prop, {
   get() { return object[`_${prop}`] },
   set(newValue) { 
    if ( object[`_${prop}`] !== newValue) {
      console.log('change maded in', prop, 'was', object[`_${prop}`], 'is', newValue)
    }
    object[`_${prop}`]  = newValue;
    },
  });
}

ob = {a: 1, b:1, c:1};
watchChanges(ob, 'a', ob.a);

ob.a = 2;
ob.a = 3;