我正在尝试从模块中获取私有属性,但我总是得到它的初始值,而不是最新的。
当提交表单并调用onSuccess时,我将partnerId设置为10.
之后,我有一个获取合作伙伴ID的点击事件,并获得-1
var SearchForm = (function ($) {
"use strict";
// Private variables
// Private functions
var onSuccess = function () {
PartnerDetail.setPartnerId(10);
};
// Public functions
return {
onSuccess: onSuccess,
};
})(jQuery);
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);
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();
});
答案 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
下面是一段代码片段,同时也展示了行为( 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
答案 4 :(得分:0)
从它的外观来看。您已将功能保存在不同的文件中。每个文件都将保持自己的私有状态。您需要将代码段合并到一个文件中,或者实现一个加载模式,该模式将授予对其他文件的私有状态的访问权。
See details about the module pattern to share private state between files