gpt4 book ai didi

javascript - 模板内部选项绑定(bind)的奇怪行为

转载 作者:行者123 更新时间:2023-12-02 15:05:19 25 4
gpt4 key购买 nike

出于某种原因,如果选择控件是在 knockout 模板内定义的,我无法选择具有空值的选项,因为选择会立即将其状态更改为默认值。 注意:如果 select 是在外部定义的,它就可以正常工作。试试看:

var ViewModel = function(){
var self = this;
self.options = [ null, 1, 2, 3];
self.selectedOption = ko.observable();
self.onSelectionChange = ko.computed(function(){
alert(self.selectedOption());
});

self.items = [{someProp: null, title: "item 1"},
{someProp: 2, title: "item 2"},
{someProp: 1, title: "item 3"},
{someProp: 1, title: "item 4"},
{someProp: 3, title: "item 5"}];

self.filteredItems = ko.computed(function(){
return self.items.filter(function(item){
return item.someProp === self.selectedOption();
});
});
};

ko.applyBindings(new ViewModel());
<script src="https://cdnjs.cloudflare.com/ajax/libs/knockout/3.2.0/knockout-min.js"></script>
<div data-bind="template: { name: 'list-template', data: filteredItems }"></div>

<script id="list-template" type="text/html">
<select data-bind="options: $root.options,
optionsCaption: 'select...',
value: $root.selectedOption"></select>
<ul data-bind="foreach: $data">
<li data-bind="text: title"></li>
</ul>
</script>

谁能解释一下为什么它会这样工作?我应该理解一些东西还是它似乎是 knockout 问题?

更新:此代码只是真实代码的简化示例。告诉我这是毫无意义的,这是没有意义的;)我的表中只有一些记录,其中一些列已按某些字段进行过滤。 我需要 select 可以同时具有欠定义值和空值,因为未定义意味着过滤器处于非事件状态,而 null 意味着我应该显示具有未设置字段的所有记录。

最佳答案

当将未定义、null 和空字符串写入选择时,Knockout 将它们视为相同的值。

请参阅下面的 writeValue:

ko.selectExtensions = {
readValue : function(element) {
switch (ko.utils.tagNameLower(element)) {
case 'option':
if (element[hasDomDataExpandoProperty] === true)
return ko.utils.domData.get(element, ko.bindingHandlers.options.optionValueDomDataKey);
return ko.utils.ieVersion <= 7
? (element.getAttributeNode('value') && element.getAttributeNode('value').specified ? element.value : element.text)
: element.value;
case 'select':
return element.selectedIndex >= 0 ? ko.selectExtensions.readValue(element.options[element.selectedIndex]) : undefined;
default:
return element.value;
}
},

writeValue: function(element, value, allowUnset) {
switch (ko.utils.tagNameLower(element)) {
case 'option':
switch(typeof value) {
case "string":
ko.utils.domData.set(element, ko.bindingHandlers.options.optionValueDomDataKey, undefined);
if (hasDomDataExpandoProperty in element) { // IE <= 8 throws errors if you delete non-existent properties from a DOM node
delete element[hasDomDataExpandoProperty];
}
element.value = value;
break;
default:
// Store arbitrary object using DomData
ko.utils.domData.set(element, ko.bindingHandlers.options.optionValueDomDataKey, value);
element[hasDomDataExpandoProperty] = true;

// Special treatment of numbers is just for backward compatibility. KO 1.2.1 wrote numerical values to element.value.
element.value = typeof value === "number" ? value : "";
break;
}
break;
case 'select':
if (value === "" || value === null) // A blank string or null value will select the caption
value = undefined;
var selection = -1;
for (var i = 0, n = element.options.length, optionValue; i < n; ++i) {
optionValue = ko.selectExtensions.readValue(element.options[i]);
// Include special check to handle selecting a caption with a blank string value
if (optionValue == value || (optionValue == "" && value === undefined)) {
selection = i;
break;
}
}
if (allowUnset || selection >= 0 || (value === undefined && element.size > 1)) {
element.selectedIndex = selection;
}
break;
default:
if ((value === null) || (value === undefined))
value = "";
element.value = value;
break;
}
}
};

您必须使用与 null 不同的 key (-1 是常见选择)

关于javascript - 模板内部选项绑定(bind)的奇怪行为,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/35156147/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com