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,但是第二个测试尝试创建一个新实例,构造函数将在其中检查该值是否为布尔值。然而,当我调试它时,它认为 showControls 以“假”开始,而不是真的。

有什么线索吗?!

谢谢

4

2 回答 2

1

dijit/_WidgetBase具有混合构造函数参数的机制,这就是您描述的行为的原因。一种可能的解决方案是将自定义设置器定义为方法_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 中的静态,AFAIK 它们附加到原型)所以如果您希望每个对象具有例如单独的值数组,请将其列为 null 和在您的构造函数中初始化。

于 2013-02-04T18:51:43.757 回答