Javascript KnockoutJS select在设置默认值后触发onChange
我在第页设置了以下更改学期的选项。当select检测到更改时,将启动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
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
是解决此问题的一个很好的选择。