Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/javascript/449.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Javascript KnockoutJS select在设置默认值后触发onChange_Javascript_Knockout.js - Fatal编程技术网

Javascript KnockoutJS select在设置默认值后触发onChange

Javascript KnockoutJS select在设置默认值后触发onChange,javascript,knockout.js,Javascript,Knockout.js,我在第页设置了以下更改学期的选项。当select检测到更改时,将启动changeSemesters函数,该函数运行一个AJAX,用特定于所选学期的数据替换页面上的当前数据 查看 <select data-bind="options: semestersArr, optionsText: 'name', optionsValue: 'id', value: selectedSemester, event: { change: changeSemesters }"></select

我在第页设置了以下更改学期的选项。当select检测到更改时,将启动
changeSemesters
函数,该函数运行一个AJAX,用特定于所选学期的数据替换页面上的当前数据

查看

<select data-bind="options: semestersArr, optionsText: 'name', optionsValue: 'id', value: selectedSemester, event: { change: changeSemesters }"></select>

问题在于,当页面加载并设置默认值时,select中的change事件会触发
ChangeSerm
函数。有没有一种方法可以避免在不使用按钮的情况下发生这种情况?

通常,在这些场景中,您要做的是使用一个按钮,这样您就可以对可观察到的变化做出反应,而不是对变化
事件做出反应。可观察对象只有在其值实际发生变化时才会发出通知

那么,你会做:

this.selectedSemester.subscribe(changeSemesters, this);
如果
selectedSerm
由于绑定而仍在更改,则可以将其初始化为默认值

this.selectedSemester = ko.observable(someDefaultValue);

通常,在这些场景中,您要做的是使用,以便您可以对可观察到的更改做出反应,而不是对更改
事件作出反应。可观察对象只有在其值实际发生变化时才会发出通知

那么,你会做:

this.selectedSemester.subscribe(changeSemesters, this);
如果
selectedSerm
由于绑定而仍在更改,则可以将其初始化为默认值

this.selectedSemester = ko.observable(someDefaultValue);

对不起,我昨天接受了这个,但我睡了一半。我尝试了第二种方法,但是我不能用默认值初始化observable,因为我正在等待Ajax调用后获得该值。如果我在那里初始化,
subscribe
将返回一个错误。我在这里设置了一个提琴:正如您所看到的,在加载值之后,
selectedsement
会在瞬间变为10,因为这是select中的第一个选项值。有没有办法让select忽略初始化过程并触发用户select?使用按钮可以解决问题,但我正在尝试不必使用按钮来构建选择。@Norbert-你能从小提琴上澄清你的问题吗?在您的选项返回之前,它看起来是未定义的。是的,但在选项返回后,该值将变为10,而不是等待
selectedSerm
完成设置为默认值,即20。我希望它从未定义跳转到20,这样第7行上的订阅在页面加载时只触发一次。我还去了KnockoutJS谷歌小组,他们告诉我在3.1测试版中使用新的
valueAllowUnset
绑定,解决了这个问题。这里有一把应该有用的小提琴:–谢谢!听起来你可以使用3.1测试版,所以
valueAllowUnset
是解决这个问题的一个很好的选择。对不起,我昨天接受了这个问题,但我睡了一半。我尝试了第二种方法,但是我不能用默认值初始化observable,因为我正在等待Ajax调用后获得该值。如果我在那里初始化,
subscribe
将返回一个错误。我在这里设置了一个提琴:正如您所看到的,在加载值之后,
selectedsement
会在瞬间变为10,因为这是select中的第一个选项值。有没有办法让select忽略初始化过程并触发用户select?使用按钮可以解决问题,但我正在尝试不必使用按钮来构建选择。@Norbert-你能从小提琴上澄清你的问题吗?在您的选项返回之前,它看起来是未定义的。是的,但在选项返回后,该值将变为10,而不是等待
selectedSerm
完成设置为默认值,即20。我希望它从未定义跳转到20,这样第7行上的订阅在页面加载时只触发一次。我还去了KnockoutJS谷歌小组,他们告诉我在3.1测试版中使用新的
valueAllowUnset
绑定,解决了这个问题。这里有一把应该有用的小提琴:–谢谢!听起来您可以使用3.1测试版,因此
valueAllowUnset
是解决此问题的一个很好的选择。