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

时间:2014-02-13 14:19:48

标签: javascript knockout.js

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

查看

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

视图模型

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
};

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

1 个答案:

答案 0 :(得分:6)

通常,您希望在这些方案中使用manual subscription,以便您可以对可观察的更改做出反应而不是更改event。 Observable只会在其值实际发生变化时通知。

所以,你会这样做:

this.selectedSemester.subscribe(changeSemesters, this);

如果selectedSemester因绑定而仍在变化,那么您可以将其初始化为默认值。

this.selectedSemester = ko.observable(someDefaultValue);