0

2 つの qooxdoo クラスがあります。

main.container :

qx.Class.define("main.container",
{
    type: "singleton",
    extend: webfrontend.gui.CustomWindow,

    construct: function() {
        this.base(arguments);
        this.setLayout( new qx.ui.layout.VBox());
        var info = new qx.ui.container.Composite( new qx.ui.layout.VBox());
        this.add(info);
        this.info = info;
    },
    destruct: function(){},
    members: {
        info: null,
        __setInfo: function(array) {
            this.info.removeAll();
            for(var i = 0; i < array.length; i++) {
                var label = new qx.ui.basic.Label(array[i]);
                this.info.add(label);
            }
        }
    }
});

main.widget :

qx.Class.define("main.widget",
{
    type: "singleton",
    extend: qx.ui.core.Widget,

    construct: function() { ... },
    members: {
        __sendData: function(data) {
            var cont = main.container.getInstance();
            var setInfo = cont.__setInfo;
            setInfo(data);
        },
        __onHover: function() {
            var data = ....
            this.__sendData(data);
        }
    }
});

私がやろうとしているのは、クラスからデータを取得してmain.widgetクラスに渡しmain.container、情報コンテナーにラベルを追加することです。

ただし、このコードを実行すると、このエラーTypeError: Cannot call method 'removeAll' of undefinedが発生しますが、コンソールでこれを実行すると、main.container.getInstance().__setInfo([...])動作します! .

私は何を間違っていますか、どうすれば修正できますか?

クードゥープレイグラウンド

4

1 に答える 1

1

__setInfo で行ったように、メソッドの前に 2 つのアンダースコアを付けると、メソッドがプライベートとしてマークされます。これは、クラス自体だけがこのメソッドにアクセスできることを意味します。qooxdoo は、ビルド プロセス中にこれらの種類のメソッドの名前を変更することで、これを強制します。別のクラスからこのメソッドにアクセスする場合は、パブリック メソッドとして実装する必要があります。つまり、メソッド名の先頭にアンダースコアを付けないでください。詳細については、クラスに関するマニュアル ページを参照してください。

于 2013-07-02T05:51:13.070 に答える