【问题标题】:Run a method everytime value changes每次值更改时运行一个方法
【发布时间】:2010-11-13 09:13:44
【问题描述】:

我想知道你们中是否有人可以帮助我解决我认为的观察问题。

我有一个元素(更具体地说是 svg),每次更改某处的值时,我都想更新它。

我有变量: GetThreadTree().treeBoxObject.getFirstVisibleRow() 最初为 0。我想在每次 GetThreadTree().treeBoxObject.getFirstVisibleRow() 的值发生变化时运行 function updateCanvas()

我拥有的是:

canvas.observe(GetThreadTree().treeBoxObject.getFirstVisibleRow(), "scroll", updateCanvas());

但是它只调用一次updateCanvas(),当它第一次被调用时,并且由于某种原因不执行它之后的代码。我检查了错误控制台,没有任何东西。

有什么想法吗?

【问题讨论】:

  • 另外,平台是什么?浏览器? Javascript 版本?
  • 没用,效果还是和我的问题一样。它适用于 Thunderbird 3.0b4pre,所以我猜 JavaScript 版本是最新版本之一。

标签: javascript events observer-pattern thunderbird


【解决方案1】:

你的逻辑都在错误的地方。当您更新您的值时,需要通过函数在一个地方完成什么,例如 treeBoxObject.IncrementRow() 或类似的。

然后您可以让该函数触发一个事件,例如 onTreeBoxRowIncremented。该事件是您所听的,当它发生变化时,您可以进行检查并更新您喜欢的任何内容。

请原谅奇怪的函数名称只是试图使用你所拥有的。

【讨论】:

    【解决方案2】:

    解决这个问题的一种方法是:

    var registeredRow = 0;
    
    function checkRow(){
        var row = GetThreadTree().treeBoxObject.getFirstVisibleRow();
        if (registeredRow != row) {
            registeredRow = row;
            updateCanvas();
        }
        window.setTimeout(checkRow, 1);
    }
    

    在调用 checkRow 之前:

    registeredRow = GetThreadTree().treeBoxObject.getFirstVisibleRow();
    checkRow();
    

    但这不是最优雅的解决方案,但它确实有效;)

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2014-06-01
      • 1970-01-01
      • 2015-01-01
      • 2021-11-25
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2017-08-10
      相关资源
      最近更新 更多