0

ブールフラグが正しく設定されていることを確認するために、Dojoウィジェットのテストをいくつか作成しています。ただし、オブジェクトを渡すようにコンストラクターを変更したため、以前に実行したテストが後続のテストに影響を与えるように見えることがわかりました。

ティアダウンメソッドでウィジェットを破棄しようとしましたが、何をしているように見えても、値は保持されます。

誰かが私が間違っているかもしれないことを提案できますか?

私のウィジェットコード:

var showControls = true;

    return declare([WidgetBase, TemplatedMixin, _WidgetsInTemplateMixin], {

        templateString: template,

        constructor: function (params) {

            this.showControls = (typeof params.showControls === "undefined" || typeof params.showControls != "boolean") ? this.showControls : params.showControls;
        }
    });

私のテストクラスは次のとおりです。

var customWidget;

doh.register("Test controls", [ 
    {
        name: "Test controls are not visible when set in constructor",
        runTest: function() {
            var params = { showControls: false };
            customWidget = new CustomWidget(params);
            doh.assertFalse(customWidget.getShowControls());
        }
    },
    {
        name: "Test controls are visible when set in constructor with string instead of boolean",
        runTest: function() {
            var params = { showControls: "wrong" };
            customWidget= new CustomWidget(params);
            doh.assertTrue(customWidget.getShowControls());
        }
    }
]);

したがって、showControlsがfalseに設定されているため、最初のテストは成功しますが、2番目のテストは新しいインスタンスを作成しようとします。このインスタンスでは、コンストラクターが値がブール値であることを確認します。ただし、これをデバッグすると、showControlsはtrueではなく'false'として開始されると見なされます。

手がかりはありますか?!

ありがとう

4

2 に答える 2

1

dijit/_WidgetBaseコンストラクターパラメーターを混在させるメカニズムがあり、それがあなたが説明した動作の理由です。考えられる解決策の 1 つは、カスタム セッターをメソッドとして定義すること_set[PropertyName]Attrです。

var defaults = {
    showControls: true
}

var CustomWidget = declare([_WidgetBase, _TemplatedMixin], {
    templateString: "<div></div>",

    constructor: function(params) {
        declare.safeMixin(this, defaults);
    },

    _setShowControlsAttr: function(value) {
        this.showControls = (typeof value === "boolean") ? value : defaults.showControls;
    }
});

実際の動作をご覧ください: http://jsfiddle.net/phusick/wrBHp/

于 2013-02-04T18:32:03.950 に答える
0

ウィジェットのメンバーをリストすることをお勧めします。そうしないと、コンストラクターに渡されたものが適切に認識されない可能性があります。this.showControls を使用したいようですので、showControls メンバーが必要です。このような :

return declare([WidgetBase, TemplatedMixin, _WidgetsInTemplateMixin], {

    templateString: template,

    showControls: true, // default value

    constructor: function (params) {
         // no further action, params are automatically mixed in already
    }
});

メンバーをリストするときは注意してください。dojo は配列とオブジェクトをクラス メンバーとして解釈します (Java の static のように、AFAIK はプロトタイプにアタッチされています)。そのため、各オブジェクトに値の個別の配列などを持たせたい場合は、それを null としてリストし、コンストラクターで初期化します。

于 2013-02-04T18:51:43.757 に答える