У меня есть элемент таблицы, где люди могут добавлять строки для добавления данных. Два поля являются взаимоисключающими: если вы вводите значение в одно, другое должно быть отключено, и наоборот. Насколько я понимаю, мне нужно сделать это в обратном вызове postRender
с использованием наблюдаемых, но я не могу найти правильный путь или строку идентификаторов. И логически не имеет большого смысла, как это будет работать. Таблица начинается пустой.
Так есть ли обратный вызов для кнопки «Добавить строку» или что-то еще, где мне нужно добавить этот logi c? Любые указания будут оценены.
Схема:
var schema = {
"type": "object",
"properties": {
"cbnum": {
"type": "string",
"required": true,
"minLength": 5,
"maxLength": 5
},
"projects": {
"type": "array",
"items": {
"type": "object",
"properties": {
"name": {
"type": "string",
"title": "Project name (required)",
"required": true
},
"tags": {
"type": "string",
"title": "Tags"
},
"hours": {
"type": "number",
"title": "Hours"
},
"percent": {
"type": "number",
"title": "Percent"
}
}
}
}
}
};
Следующий код не работает (опять же, неудивительно, когда вы думаете об этом, но я не знаю, что еще попробовать ):
var postRenderCallback = function(control) {
var hours = control.childrenByPropertyId["projects"].childrenByPropertyId["hours"];
var percent = control.childrenByPropertyId["projects"].childrenByPropertyId["percent"];
hours.on("change", function() {
if (this.getValue().length > 0) {
percent.setValue("");
percent.options.disabled = true;
} else {
percent.options.disabled = false;
}
});
percent.on("change", function() {
if (this.getValue().length > 0) {
hours.setValue("");
hours.options.disabled = true;
} else {
hours.options.disabled = false;
}
});
};
Обновление
Следующее postRenderCallback
исправило постоянную проблему с отключением:
var postRenderCallback = function(control) {
var table = control.childrenByPropertyId["projects"];
table.on("add", function() {
var lastrow = this.children[this.children.length-1];
var hours = lastrow.childrenByPropertyId["hours"];
var percent = lastrow.childrenByPropertyId["percent"];
hours.options.disabled = false;
percent.options.disabled = false;
hours.refresh();
percent.refresh();
});
};
Но затем я столкнулся с парой других проблем, которые только что сделали вся эта проблема решения c (большая проблема заключается в том, что я не могу найти способ просто установить числовое поле пустым или undefined
; он продолжает отображаться как NaN
). Поэтому я выбрал следующее решение, которого достаточно. Вот соответствующий фрагмент объекта options
:
"projects": {
"type": "table",
"actionbarStyle": "bottom",
"items": {
"fields": {
"tags": {
"type": "tag"
},
"hours": {
"allowOptionalEmpty": true,
"validator": function (callback) {
var that = this.parent.childrenByPropertyId["percent"];
var thisValue = this.getValue();
var thatValue = that.getValue();
if ( (typeof thisValue !== "undefined" && !isNaN(thisValue)) && (typeof thatValue !== "undefined" && !isNaN(thatValue)) ) {
callback({
"status": false,
"message": "You can only enter a number into one of the fields, if any. You may not have numbers in both."
});
} else {
callback({
"status": true
});
}
}
},
"percent": {
"allowOptionalEmpty": true,
"validator": function (callback) {
var that = this.parent.childrenByPropertyId["hours"];
var thisValue = this.getValue();
var thatValue = that.getValue();
if ( (typeof thisValue !== "undefined" && !isNaN(thisValue)) && (typeof thatValue !== "undefined" && !isNaN(thatValue)) ) {
callback({
"status": false,
"message": "You can only enter a number into one of the fields, if any. You may not have numbers in both."
});
} else {
callback({
"status": true
});
}
}
}
}
}
}
Все еще не идеальное решение UX (я не могу заставить валидатор одного поля выполнять валидатор другого поля; я пробовал this.parent.validate(true)
), но на данный момент он достаточно функционален.