0

私は自分の問題を説明するために少しテストを書きました:

<div id="test1"></div>
<div id="test2"></div>
<script>
    (function ($) {
        $.widget("mseh.testIt", {
            options : {
                foo : false,
                bar : false
            },

            _settedOptions : {
                foo : false,
                bar : false
            },

            readOptions : function() {
                return this._settedOptions;
            },

            _init : function() {
                this._initializeTest();
            },

            _initializeTest : function() {
                var self = this;
                $.each(self.options, function(key, value) {
                    self._settedOptions[key] = value;
                });
            }
        });
    })(jQuery);

    $('#test1').testIt({ foo : true, bar : false});
    $('#test2').testIt({ foo : true, bar : true});

    console.log($('#test1').testIt('readOptions'));
    console.log($('#test2').testIt('readOptions'));

</script>

この例では、両方のログで「foo」の場合はtrue(期待どおり)、「bar」の場合はtrue(期待どおりではない)が得られます。

これはバグですか、それとも何か間違ったことをしていますか?

jQuery1.7.2および1.9.1でテスト済み。jQueryUI1.9.2および1.10.0でテスト済み。

ありがとう

4

1 に答える 1

2

testItのすべてのインスタンスで_settedOptionsが共有されているためです。

以下のようにtest1とtest2の間の_settedOptionsのオブジェクトの同等性をチェックすると、それらは同じオブジェクトを参照します。

console.log( $('#test1').testIt('readOptions') === $('#test2').testIt('readOptions') );

インスタンス変数として扱いたい場合は、以下に記述してください。

(function ($) {
    $.widget("mseh.testIt", {
        options : {
            foo : false,
            bar : false
        },

        // This field will be shared in every instance.
        // _settedOptions : {
        //     foo : false,
        //     bar : false
        // },

        readOptions : function() {
            return this._settedOptions;
        },

        _init : function() {
            // like this!!!!!
            this._settedOptions = {
                foo : false,
                bar : false
            };

            this._initializeTest();
        },

        _initializeTest : function() {
            var self = this;
            $.each(self.options, function(key, value) {
                self._settedOptions[key] = value;
            });
        }
    });
})(jQuery);
于 2013-02-15T08:59:41.777 に答える