订阅选择列表选择选项的淘汰赛js重复显示未定义

时间:2014-01-28 15:20:24

标签: javascript knockout.js

我有一个预先填充了字符串列表的下拉列表。我的选择列表绑定是这样的:

<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(我统计)警报“未定义”。

2 个答案:

答案 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)

实例:http://jsfiddle.net/2NqFY/