今天我任务是,我一直在琢磨了一段时间的问题。 我有一个页面,当从下拉列表中选择一个项目,有一个数据库调用,获取信息,并设置根据检索到的数据所需的日期字段上的表单。 这工作得很好,但我有下拉菜单设置为淘汰赛的change
事件绑定,并重温页面的更新时, 用户之前与页面交互 ,从而设置所需日期到任何数据库调用最初得到这个事件运行两次 。 这里的问题是,最终用户可以设置不同的日期比预产期,我需要这个调用,除非用户实际使用下拉相互作用 ,不覆盖现有的日期。
我会试着修剪这个以节省一些头痛...
下拉:
@Html.SearchPickerFor(m => m.ItemNumber, "ItemPicker", new { @class = "form-control" }.AddMore("data-bind", "value: $data.ItemNumber, event: { change: ItemNumericDetails($data) }" ))
去上改变ItemNumericDetails功能:
本质上,重定向到其他两个功能。
var ItemNumericDetails = function (lineData) {
GetItemInfo(lineData);
GetPriceUpdateTolerance(lineData);
}
这两个功能都非常相似AJAX调用时,一个我们关心的是GetItemInfo
。 lineData是在我的模型一行(在1对多模式关系的孩子),从淘汰赛的到来$data
的功能。
var GetItemInfo = function (lineData) {
var orgId = lineData.ShipToOrgID();
var orgType = lineData.ShipToOrgType();
var itemNo = lineData.ItemNumber();
if ((orgId !== undefined && orgId !== "" && orgId !== null) &&
(orgType !== undefined && orgType !== "" && orgType !== null) &&
(itemNo !== undefined && itemNo !== "" && itemNo !== null)) {
var model = {
orgId: orgId,
orgType: orgType,
itemNumber: itemNo,
destTPID: koModel.ModelData.DestTPID()
};
var model = ko.mapping.toJS(model);
$.ajax({
url: '@Url.Action("ItemInfo")',
method: 'GET',
headers: addAntiForgeryHeader(),
datatype: 'json',
contentType: "application/json; charset=utf-8",
traditional: true,
data: model
}).done(function (data) {
//...
//model value assignment
//...
// V V V DATE CHANGING CODE HERE
var date = new Date();
lineData.CalculatedDate(date.addDays(lineData.LeadTime()));
lineData.RequiredDate(lineData.CalculatedDate());
// ^ ^ ^
}).fail(function () {
console.log("An error occurred while getting order quantities data.");
});
}
}
我曾尝试:
工作方法,我目前所面对的是,我已经设置了全球级别的迭代器,称为OQIterations
是从零开始,每个呼叫运行时间计数,它已经运行了两次后日期更改随后允许进行。 这是什么样子:
var OQIterations = 0;
var GetItemInfo = function (lineData) {
if (lineData.OQIterations === undefined) {
lineData.OQIterations = OQIterations;
// Assigns each line it's own iteration counter if it does not have one.
}
var orgId = lineData.ShipToOrgID();
var orgType = lineData.ShipToOrgType();
var itemNo = lineData.ItemNumber();
if (...) {
var model = {
...
};
var model = ko.mapping.toJS(model);
$.ajax({
...
}).done(function (data) {
...
// V V V Checks if the call has been made twice and if it has the next call will be able to modify the date
if (lineData.OQIterations >= 2) {
var date = new Date();
lineData.CalculatedDate(date.addDays(lineData.LeadTime()));
lineData.RequiredDate(lineData.CalculatedDate());
}
lineData.OQIterations++;
}).fail(function () {
console.log("An error occurred while getting order quantities data.");
});
}
}
这工作,但它似乎是一个真正哈克的方式做到这一点,我也不能保证该函数将始终运行前两次在页面加载,所以我不认为这是什么,但一个临时的解决办法做。
什么可能我用这个方法,而不是保持自动日期分配到位,并防止发生的种种变化,直到用户实际使用下拉交互?
任何帮助是极大的赞赏。