设置默认值后,KnockoutJS选择触发onChange

Nor*_*ert 1 javascript knockout.js

我在页面上设置了以下选择以更改学期.当select检测到更改时,将changeSemesters触发该函数,该函数运行AJAX,该AJAX用特定于所选学期的数据替换页面上的当前数据.

视图

<select data-bind="options: semestersArr, optionsText: 'name', optionsValue: 'id', value: selectedSemester, event: { change: changeSemesters }"></select>
Run Code Online (Sandbox Code Playgroud)

视图模型

this.selectedSemester = ko.observable();

//runs on page load
var getSemesters = function() {
  var self = this, current;

  return $.get('api/semesters', function(data) {
    self.semestersArr(ko.utils.arrayMap(data.semesters, function(semester) {
      if (semester.current) current = semester.id;
      return new Model.Semester(semester);
    }));

    self.selectedSemester(current);
  });
};

var changeSemesters = function() {
  // run ajax to get new data
};
Run Code Online (Sandbox Code Playgroud)

问题是select中的change事件在changeSemester页面加载时触发函数并设置默认值.有没有办法避免使用按钮?

RP *_*yer 6

通常,您希望在这些场景中使用手动订阅,以便您可以对可观察的更改做出反应而不是更改event.Observable只会在其值实际发生变化时通知.

所以,你会这样做:

this.selectedSemester.subscribe(changeSemesters, this);
Run Code Online (Sandbox Code Playgroud)

如果selectedSemester由于绑定而仍在更改,则可以将其初始化为默认值.

this.selectedSemester = ko.observable(someDefaultValue);
Run Code Online (Sandbox Code Playgroud)