Javascript 为什么在load knockoutJs上调用subscribe下拉事件?

Javascript 为什么在load knockoutJs上调用subscribe下拉事件?,javascript,knockout.js,html-select,subscribe,Javascript,Knockout.js,Html Select,Subscribe,这可能是一个基本问题,但我无法找到任何解决方案 我试图在下拉列表中显示格式列表。我使用敲除绑定来实现这一点我希望最初显示特定值 当用户从下拉列表中选择其他值时,它应显示所选值(工作正常) 在选择任何选项时,我希望获得所选值,以便将其发送到服务器。我正在使用订阅 下面是我的代码: var obj=this; obj.formatArray=ko.observatarray([{'text':“MM/DD/YYYY”}, {'text':“MM-DD-YYYY”}, {'text':“MM.DD.

这可能是一个基本问题,但我无法找到任何解决方案

我试图在下拉列表中显示格式列表。我使用敲除绑定来实现这一点<代码>我希望最初显示特定值

当用户从下拉列表中选择其他值时,它应显示所选值(工作正常)

在选择任何选项时,我希望获得所选值,以便将其发送到服务器。我正在使用
订阅

下面是我的代码:

var obj=this;
obj.formatArray=ko.observatarray([{'text':“MM/DD/YYYY”},
{'text':“MM-DD-YYYY”},
{'text':“MM.DD.YYYY”},
{'text':“DD/MM/YYYY”},
{'text':“DD-MM-YYYY”},
{'text':“DD.MM.YYYY”});
var format1='DD-MM-YYYY';
obj.formatArrayDefault=ko.observable({text:format1});
obj.formatArrayDefault.subscribe(函数(newValue){
警报(“默认值”+format1);
警报(“订阅中的新值”+newValue.text);
});
ko.应用绑定(obj)

如果您只想在任何更改后获得下拉列表的值

只需获取一个可观察值并将其设置为下拉列表中的值,最初它将为空,在订阅函数中只需添加一行比较,如果下拉列表中的值为空,则不要调用警报函数

var obj=this;
obj.formatArray=ko.observatarray([{'text':“MM/DD/YYYY”},
{'text':“MM-DD-YYYY”},
{'text':“MM.DD.YYYY”},
{'text':“DD/MM/YYYY”},
{'text':“DD-MM-YYYY”},
{'text':“DD.MM.YYYY”});
var format1='DD-MM-YYYY';
obj.initialLoad=true;
obj.formatArrayDefault=ko.可观察(format1);
obj.formatArrayDefault.subscribe(函数(newValue){
if(对象初始加载){
obj.initialLoad=false;
}
否则{
警惕(“你好”);
}
});
ko.应用绑定(obj)

您的阵列包含普通对象。在javascript中,对象比较的工作方式如下:

var obj1 = { a: 1 };
var obj2 = { a: 1 };

console.log(obj1 === obj2); // false
console.log(obj1 === obj1); // true
它检查由变量引用的实际对象实例,而不是其外观。许多库都包含一个“deepEquals”函数,可以用来检查两个对象是否看起来很相似,但knockout并没有使用这种机制

因此,当您设置初始选择时,它的值可能与
formatArray()[0]
处的对象相似,但knockout无法将两者结合在一起。即:

obj.formatArrayDefault() === obj.formatArray()[1]; // false
现在,当应用绑定时,knockout试图解决选择和源数据之间的不匹配问题。它找不到与传递给
值的选择匹配的
元素

它必须渲染选定的选项,因此默认为第一个选项。这是当您的初始对象被
formatArray()[0]
替换并触发订阅时

这里有一个解决方案:我们在初始值中实际引用第一个对象

var obj=this;
obj.formatArray=ko.observatarray([{'text':“MM/DD/YYYY”},
{'text':“MM-DD-YYYY”},
{'text':“MM.DD.YYYY”},
{'text':“DD/MM/YYYY”},
{'text':“DD-MM-YYYY”},
{'text':“DD.MM.YYYY”});
var format1='DD-MM-YYYY';
obj.formatArrayDefault=ko.obj.formatArray()[1]);
obj.formatArrayDefault.subscribe(函数(newValue){
console.log(“默认值”+format1);
log(“订阅中的新值”+newValue.text);
});
ko.应用绑定(obj)


我想显示一个默认值。它不能是空的。这就是要求。然后,不要使用未定义的默认值来比较,而不要调用没有帮助的订阅函数:(请参阅我编辑的代码段。在subscribe中,它已将值更改为格式数组中的第一个值。显示编辑的答案。希望它现在能帮助您……:)它将下拉列表中的值更改为初始值(mm/dd/yyyy)。:(我想在那里显示默认值(dd-mm-yyyy)。感谢您的解释。:)