我的節目時不正確的:敲除數據綁定值添加新行動態
我有數據的一個表,它是可觀察的可觀察到的陣列。
- 當退出最後一行的最後一個輸入時,它會添加一行新的空輸入。焦點在新行的第一個輸入中設置。
- 項目編號中的用戶類型;當他們標籤了它在該項目編號一些檢查,並根據它是否通過這些檢查
- 它繼續到下一個字段
- 它可以追溯到該輸入並給出了一個消息,說明無效的輸入和選擇文本。
這一切工作正常。因此,用戶通過並輸入該行中的所有有效數據,然後從最後一個輸入中跳出並添加一個新行。 但它沒有把重點放在第一個輸入,我甚至不能在那裏點擊,我假設因爲hasFocus
/invalidItem
變量設置爲false。我不確定如何在添加新行時將其設置爲true。
這裏是我的相關HTML:
<tbody data-bind="foreach: items">
<tr>
<td>
<div data-bind="if: (itemNo.length < 1)"><input data-bind="value: itemNo, hasFocus: $parent.invalidItem, selected: $parent.invalidItem, event: { blur: $parent.checkItemNo }, attr: { name: 'brochureitems[' + $index() + '].itemNo', id: 'brochureItems_' + $index() + '__itemNo' }, validationOptions: { errorElementClass: 'input-validation-error' }" class="form-control item-id" /></div>
這裏是我的相關淘汰賽:
var itemModel = function (data) {
var self = this;
self.itemNo = ko.observable(data ? data.itemNo : undefined).extend({
required: {
params: true,
message: "Item no. required."
}
});
self.brocCode = ko.observable(data ? data.brocCode : undefined).extend({
required: {
params: true,
message: "Bro code required."
}
});
self.itemDesc = ko.observable(data ? data.itemDesc : undefined).extend({
required: {
params: true,
message: "Item desc required."
}
});
self.retail = ko.observable(data ? data.retail : undefined).extend({
required: {
params: true,
message: "Retail required."
}
});
self.prizeNum = ko.observable(data ? data.prizeNum : undefined).extend({
required: {
params: true,
message: "Prize num required."
}
});
self.itemOrder = ko.observable(data ? data.itemOrder : undefined).extend({
required: {
params: true,
message: "Item order required."
}
});
}
var itemsModel = function(items) {
var self = this;
self.items = ko.observableArray(items);
self.invalidItem = ko.observable(true);
console.log("focus has been set");
self.checkItemNo = function(data) {
console.log("lost focus - " + self.invalidItem());
var itemNo = $.trim(data.itemNo());
if (itemNo != "") {
var item = "";
$.each(window.listOfItems, function(i, v) {
if (v.No.search(itemNo) != -1) {
item = v.Description;
return;
}
});
if(item != "") {
var match = ko.utils.arrayFirst(self.items(), function(newItem) {
return itemNo === newItem.itemNo;
});
console.log("match: " + match);
if (!match) {
data.itemDesc(item);
} else { // item already entered
setTimeout(function() { self.invalidItem(true); }, 1);
slideDownMsg("Item already entered.");
slideUpMsg(3000);
}
} else { // invalid item #
setTimeout(function() { self.invalidItem(true); }, 1);
slideDownMsg("Invalid item number.");
slideUpMsg(3000);
}
}
}
self.submit = function() {
//self.showErrors(true);
if (viewModel.errors().length === 0) {
console.log('Thank you.');
$("#brochureForm").submit();
}
else {
console.log('Please check your submission.');
viewModel.errors.showAllMessages();
$(".input-validation-error").first().focus();
}
}
self.addLine = function() {
self.invalidItem(true);
console.log(self.invalidItem());
self.items.push(new itemModel());
//setTimeout(function() { self.invalidItem(true); }, 1);
};
更新
OK,我得到了我的小提琴像我的本地代碼工作現在。這裏撥動:https://jsfiddle.net/tLfezuu1/8/ 因此,當用戶從最後一個輸入中跳出時,它會添加一行新的空白輸入。用戶在第一個輸入中鍵入一個數字並點擊選項卡。它對該數字執行一些檢查,如果檢查通過,則將焦點發送到下一個輸入,或者如果檢查失敗,則將焦點發送回該輸入以突出顯示文本。
會幫助,如果你能後運行一個片段或小提琴。在代碼中有一些令我擔心的事情,但很難分辨究竟是什麼導致了這個問題......(例如:爲什麼'setTimeout's?是'itemNo'可觀察與否?爲什麼是'$()。 focus()'?爲什麼'value'綁定並訂閱'blur'?) – user3297291
感謝您的提示。我會努力學習小提琴。需要超時,因爲我從我的最後一個問題了解到:http://stackoverflow.com/questions/41557273/knockoutjs-hasfocus-implementation-on-dynamically-added-row – dmikester1
'itemNo'是可觀察的。你是在談論這一行:'$(「。input-validation-error」)。first()。focus();'? – dmikester1