2

匿名関数内から AJAX 呼び出しを行っています。成功のコールバックが発生すると、カスタム JS オブジェクト ID と、データ サーバーから受信したその他の重要な情報を設定できます。

a.target.id を返された data.id に設定した後、すべてが正常に見えます。

新しく更新されたカスタム JS オブジェクトで何らかの作業を行う関数を呼び出すステップで、サーバーからの応答データで更新しました。そのオブジェクトの親をメソッドに渡して、そのオブジェクトのすべての子に対して何らかの作業を行います。

ただし、スナップショット写真の最後の例でわかるように、 a.target.parent.children[0].id はコレクションにないか、設定されていない ID です。

匿名関数を使用している場合、AJAX 呼び出し中にそのオブジェクトへの参照が失われているに違いありません。

これがすべてのコードです。どうすれば参照を失うのですか? または、AJAX 呼び出しが返されたときに、その親の子への参照をどのように維持できますか?

これまでにこれが起こったことは一度もありません。匿名機能と関係があると思います。

var horizontalPositioner = function (horizontals) {

    var hpa = ['?horPositions='];

    for (var i = 0; i < horizontals.children.length; i += 1) {

        hpa.push(horizontals.children[i].id + ':' + horizontals.children[i].position + ',');
    };

    hpa[i] = hpa[i].replace(',', '');

    dataBase.update(dbPart('horizontal' + hpa.join('')));
};


this.subscribe.call(this, e.horizontaladded, function (a, fn) {
    //
    if (!a.extra.owner.id) {
        return;
    };

    (function (a) {

        dataBase.insert(
            dbPart(
            ['horizontal?a=', a.extra.owner.instanceName, '&id=', a.extra.owner.id].join(''),
            a.target
            ),
            dbCB(
            function (data, status) {
                if (status === 'error') { return; };

                a.target.id = data.id,
                a.target.HTML().addClass('alum_' + data.id),
                a.target.finish.id = data.finishID,
                a.target.size.id = data.sizeID,
                a.target.siteLine.id = data.sitelineID;
                //
                //reposition horizontals
               // setTimeout(function () { horizontalPositioner(a.target.parent); }, 1000);
                debugger
                horizontalPositioner(a.target.parent);

                if (fn) { processCallbacks(data, status, fn); };


                //very last
                events.publishDatabaseCallbacks(e.horizontaladded,
                    eArgs(a.bay, { data: data, instanceName: 'horizontal', ownerid: a.extra.owner.id, id: data.id }));

            },
            function (xhr, status, errorThrown) { console.log('ERROR adding horizontal'); })
        );

    }(a));

}, true);

3 つのステップのスナップショット

4

1 に答える 1

0

ネストされた setTimeout を持つ無名関数を追加して、すべてのビルド時間を確保しました。一度に多くのイベントが行われているので、今のところこれでうまくいきます。

var horizontalPositioner = function (horizontals) {

    (function (hors) {

        setTimeout(function () {

            var hpa = ['?horPositions='];

            for (var i = 0; i < hors.children.length; i += 1) {
                hpa.push(hors.children[i].id + ':' + (hors.children[i].position ? hors.children[i].position : 1) + ',');
            };

            hpa[i] = hpa[i].replace(',', '');

            dataBase.update(dbPart('horizontal' + hpa.join('')));

        }, 1000);

    }(horizontals));
};
于 2013-07-16T02:47:18.250 に答える