我有一个预先填充了字符串列表的下拉列表。我的选择列表绑定是这样的:
<select id="industryDropDown"
data-bind="options: $root.orgIndustrySuggestions, value: $root.selectedIndustryTag, optionsCaption: ''"></select>
在我的viewmodel中,我有这个:
self.selectedIndustryTag.subscribe(function (newValue) {
if (newValue !== '') {
if (newValue !== 'undefined')
{
alert(self.selectedIndustryTag());
self.selectedIndustryTag('');
}
}
}, self);
我试图从下拉列表中获取所选值,执行alert()现在的操作,然后将所选值重置为默认的空字符串选项。
目前,当我运行此页面时,页面加载很好。但是,当我选择某些内容时,它会首次向我显示所选值,但是在此之后,它们会发出一个kajillion(我统计)警报“未定义”。
答案 0 :(得分:1)
你的逻辑过于复杂。创建一个演示错误的小提琴,我们可能会告诉你原因,但简而言之,你有一个递归循环(你正在订阅一个值并将其设置在该函数内)并且你还在多次测试时需要 -
self.selectedIndustryTag.subscribe(function (newValue) {
if (newValue) {
alert(self.selectedIndustryTag());
// The next line will refire the subscription
//self.selectedIndustryTag('');
}
}, self);
条件语句 - if(newValue)将测试newValue是否等于null,undefined,false或string empty('')
答案 1 :(得分:1)
那完全是一个kajillion吗?或者它更像是十亿?
您遇到此问题的原因是您正在进入无限循环。 UI中selectedIndustryTag
的更改会提升订阅。在订阅内部,您更改了selectedIndustryTag
,这会引发订阅,这会更改selectedIndustryTag
....这样您可能会得到重点。
解决此问题的方法是拥有2个属性。由UI编辑的实时编辑,您可以订阅,以及您在内部使用的第二个编辑(订阅可以更新)。
您遇到的另一个问题是,您使用严格的非等值运算符!==
,但与字符串'undefined'
进行比较。这将永远无法评估,因为您应该与undefined
(没有引号)进行比较。
所以改变
if (newValue !== 'undefined')
到
if (newValue !== undefined)