5

これはばかげているように見えるかもしれませんが、この時代では、配列の内容が変更された場合にJSがイベントを発生させることを期待できるはずです。

変数が変更されたときに通知を受け取ることに関して、いくつかの質問がありました(getterまたはsetterを定義します)。そして、それを行う方法があるようです(少なくともIE6 +を含むほとんどのブラウザでは)

私の問題は、配列内のアイテムが変更された場合に通知を受け取ろうとしていることです。

    var ar = ["one", "two", "three"];
    // setting the whole array will call the custom setter method
    // (assuming you defined it)

    ar = ["one", "three", "five"];

    // however, this will only call the getter method and won't call the setter
    // without defining custom setters for every item in the array.  

    ar[1] = "two";

明らかに、私はコーダーに昔ながらのJavaスタイル.getVale().setValue()関数を使用してデータにアクセス/変更することを強制しないようにしています。

4

3 に答える 3

3

要するに:いいえ、できません。配列にはイベントディスパッチメカニズムがなく、APIにはコールバックタイプの機能が含まれていないことに気付くでしょう。

もっと長く:他の人が指摘しているように、配列をラップすることは可能です…そして配列の内容をポーリングすることも可能です:

function watchArray(arr, callback) {
    var oldVal = "" + arr;
    setInterval(function() {
        var curVal = "" + arr;
        if (curVal != oldVal) {
            callback();
            oldVal = curVal;
        }
    }, 100);
}

ただし、この方法には明らかな問題がいくつかあります。ポーリングする、配列の束を監視するのが遅くなるなどです。

于 2012-06-06T16:22:34.327 に答える
0

わかりました。@DavidWoleverのコードと他のコメントに基づいて、実際には解決策があります。

John Dyerからのメモを使用して、addPropertyメソッドを実装します。getterメソッドにsetTimeoutを設定して、読み取りが行われた直後に元の値と比較します。

addProperty(myObject, 'vals',
    function () {
        var _oldVal = "" + this._val;
        var _parent = this;
        console.log('getter!');
        setTimeout(function () {
            var curVal = "" + _parent._val;
            if (curVal != _oldVal)
                console.log('array changed!');
        }, 200);
        return this._val;
    },
    function (value) {
        console.log('setter!');
        this._val = value;
    });

    myObject.vals = ["one", "two", "three"];
    myObject.vals[1] = "five";
于 2012-06-06T17:03:29.013 に答える
0

timeoutベースのソリューションは最善ではないと思います。
プッシュとポップのみを使用して配列を変更できる場合は、プロトタイプのメソッド(または監視するオブジェクトのみ)をオーバーライドpushできpopますArray

var myWatchableArr = [];
myWatchableArr.setChangeCallback = function(callback){
    this.changeCallback = callback;
}
myWatchableArr.push = function(e){
    Array.prototype.push.call(this,e);
    if(typeof this.changeCallback == "function")
      this.changeCallback(this);
}
myWatchableArr.push(3);
myWatchableArr.setChangeCallback(function(arr){
    console.log("the array has been changed", arr);
});
// now watching for changes
myWatchableArr.push(4);

プッシュとポップでは不十分な場合は、の代わりにsetAt使用するメソッドを追加できます。myWatchableArr.setAt(3, value)myWatchableArr[3]=value

于 2014-12-14T12:04:48.777 に答える