1

oo javascript の操作に問題があります。新しいオブジェクトのパブリック メソッドとプライベート メソッドを作成しています。public メソッドを呼び出しているときに、private 変数にアクセスできません。

私はreturn公共の方法(インターネット)を使うべきだと信じていますが、その理由は本当にわかりません。 誰かが私が欠けているものを説明してもらえますか?

function something(){
    var somePanel;  // it is a jquery object to a div

    var createWindow = function(data){
        random.xhr('/chat', 'GET', null, function(res){
            var Container = $("#Container");
            somePanel = $("<div/>").addClass('somePanel').append(res);
            Container.append(somePanel.hide());
        });     
    };

    this.activate = function(){
        somePanel.show().siblings().hide();
    };

    this.init = function(data, fn){
        createWindow(data);
    };
};


connections[data] = new something();  // creates a new something object
connections[data].init(data);   //  which creates just a div object, actually
connections[data].activate();  // has code to show this panel and hide every other panel

メソッドを呼び出すと、activate()が見つかりませんsomePanel。どうすればいいですか?なぜ?

4

2 に答える 2

3

非同期メソッドの古典的な問題。

を実行すると、xhr ハンドラーは呼び出されませんactivate。xhr ハンドラーが実行されるのを待ってから、コールバックで を呼び出す必要がありますactivate

これらの行に沿ったもの:

// ...

this.init = function(data, fn){
    createWindow(data, fn);
};

var createWindow = function(data, fn) {
    random.xhr('/chat', 'GET', null, function(res){
        var Container = $("#Container");
        somePanel = $("<div/>").addClass('somePanel').append(res);
        Container.append(somePanel.hide());
        fn();
    });     
};

// ...

connections[data] = new something();
connections[data].init(data, function () { connections[data].activate() });
于 2013-10-26T18:21:41.913 に答える
0

somePanel非同期呼び出しへのコールバックを設定しています。somePanelあなたが呼び出すまでに設定されていることを保証することはできませんactivate()

edit meagar's answer は、オブジェクト指向の観点からは最良の選択肢です。私の答えの残りの部分は、あなたが達成しようとしている読みやすさを維持することを目的としています。

非同期チェーン ( asyncなど) またはpromisesを可能にするモジュールの使用を検討することをお勧めします。

于 2013-10-26T18:22:35.347 に答える