Javascript模块模式返回私有属性的初始值

时间:2015-04-24 13:33:34

标签: jquery javascript

我正在尝试从模块中获取私有属性,但我总是得到它的初始值,而不是最新的。

当提交表单并调用onSuccess时,我将partnerId设置为10.

之后,我有一个获取合作伙伴ID的点击事件,并获得-1

search.js

var SearchForm = (function ($) {
    "use strict";
    // Private variables
    // Private functions
    var onSuccess = function () {
        PartnerDetail.setPartnerId(10);
    };
    // Public functions
    return {
        onSuccess: onSuccess,
    };
})(jQuery);

detail.js

var PartnerDetail = (function ($) {
    "use strict";
    var _partnerId = -1;
    var getPartnerId = function () {
        return _partnerId;
    };
    var setPartnerId = function (id) {
        _partnerId = id;
    }
    // Public functions
    return {
        getPartnerId: getPartnerId,
        setPartnerId: setPartnerId
    };
})(jQuery);

search.internal.js

var SearchAll = (function ($) {
    "use strict";
    // Private variables
    // Private functions
    var init = function () {
        $("#partner").on("click", function () {
            var p = PartnerDetail.getPartnerId();
            console.log(p); ==> -1
        }
    };
    // Public functions
    return {
        init: init
    };
})(jQuery);

(主页)

// Load when ready
$(document).ready(function () {
    SearchAll.init();
});

5 个答案:

答案 0 :(得分:0)

您的代码似乎没问题:

我已将以下代码放在jsFiddle中,并记录10:

HTML:

<button id="partner">CLICK!</button>

JS:

var PartnerDetail = (function () {
    var _partnerId = -1;
    var getPartnerId = function () {
        return _partnerId;
    };

    var load = function (id) {
        _partnerId = id;
    }

    // Public functions
    return {
        getPartnerId: getPartnerId,
        load: load
    };
})();

// File search.js

var SearchForm = (function ($) {

    "use strict";

    // Private variables

    // Private functions

    var onSuccess = function () {

        PartnerDetail.load(10);
    };

    // Public functions
    return {

        onSuccess: onSuccess,
    };

})(jQuery);


var SearchAll = (function ($) {

    "use strict";

    // Private variables

    // Private functions
    var init = function () {

        $("#partner").on("click", function () {

            var p = PartnerDetail.getPartnerId();

            console.log(p);
        });

    };

    // Public functions
    return {

        init: init
    };

})(jQuery);

// Load when ready
$(document).ready(function () {

    SearchAll.init();
    SearchForm.onSuccess();
});

答案 1 :(得分:0)

@Patrick - 你的代码很好,除了两个小错误。您需要注释掉==> -1,然后关闭以下行中的括号。此外,您还没有包含有关表单的代码,以及它的行为(即调用onSuccess)。此外,您尚未指定正在使用的浏览器。

    console.log(p); ==> -1
}

应该是

    console.log(p); // ==> -1
});

解决方案:

Here's an example of it working in jsbin

  • 您提到的onSuccess在提交表单时被调用,但您未在示例中包含此代码。所以我冒昧地将它添加到我的例子中。
  • 在提交表单之前记录-1,在
  • 之后10
  • 在Opera 25中测试
  • 使用单独的js文件(根据要求)

下面是一段代码片段,同时也展示了行为( N.B。加载速度有点慢)。

// Load when ready
$(document).ready(function () {
    SearchAll.init();
});
<script src="//code.jquery.com/jquery-1.11.1.min.js"></script>
<script src="https://rawgit.com/nickgrealy/bc1f5452cff303348fe7/raw/53c9248298268cea69a49e24895cdc59f9b7da82/detail.js"></script>
<script src="https://rawgit.com/nickgrealy/bc1f5452cff303348fe7/raw/b2cd08800fcec69195e85efd508015c699a4926d/search.internal.js"></script>
<script src="https://rawgit.com/nickgrealy/bc1f5452cff303348fe7/raw/dfb8296180dc3f3302f4a9175c6961b8089fb947/search.js"></script>

<form target="#" onsubmit="SearchForm.onSuccess();return false;">
    <input type="Submit" value="1. Form Submit" />
</form>
<input id="partner" type="button" value="2. Log partnerId"></button>

供参考,以下是要点中的js file's source code

答案 2 :(得分:0)


在我看来,这与你的活动的执行时间有关。 提交表单时会调用onSucess函数,不是吗? 但是你的onClick函数会立即执行。因此,您的变量在onClick事件中的初始属性始终为-1,因为onSucess时尚未调用onClick 这里有一个小桌子来详细阐述我对你的事件的看法:

onclick, value = -1
onclick, value = -1          value=10
onclick, value = -1          value=10
value=10

答案 3 :(得分:0)

在获得PartnerDetail.getPartnerId();之前,请设置它的值。

PartnerDetail.setPartnerId(10);
var p = PartnerDetail.getPartnerId();
console.log(p) // 10

演示http://jsfiddle.net/zLexLvza/1/

答案 4 :(得分:0)

从它的外观来看。您已将功能保存在不同的文件中。每个文件都将保持自己的私有状态。您需要将代码段合并到一个文件中,或者实现一个加载模式,该模式将授予对其他文件的私有状态的访问权。

See details about the module pattern to share private state between files