knockoutjs调用一直在执行,怎么能只调用一次呢

knockoutjs call keeps executing, how can I call it only once?

本文关键字:调用 一次 怎么能 一直 执行 knockoutjs      更新时间:2023-09-26

我有一段代码:

t._teacherOptions = ko.observable();
function getTeacherList() {
  $.ajax({
    type: "POST",
    url: "/webservices/Service.asmx/GetTeachers",
    contentType: "application/json; charset=utf-8",
    dataType: "json",
    success: function(i) {
      if (i.d) {
        console.log(i.d);
        return t._teacherOptions(i.d);
      }
    },
    error: function(n) {
      u(n);
    }
  });
}
t.TeacherOptions = ko.computed(function() {
  getTeacherList();
  return t._teacherOptions();
});

然后我的html:

<select data-bind="options: $root.TeacherOptions(), value: Id, optionsText: 'Name'"></select>

出于某种原因,当页面打开时,获取教师列表的功能会不断循环。

我能够得到我需要的结果,但循环不断,我需要停止。我在这里做错了什么?

由于TeacherOptions(它是一个computed)访问_teacherOptions(因此创建了一个依赖项),并且由于您在Ajax调用的success回调中更改了_teacherOptions的值,因此TeacherOptions将被再次求值(因为它依赖于_teacherOptions),并再次发出Ajax请求。

尝试在computed:之外呼叫getTeacherList()

t._teacherOptions = ko.observable();
function getTeacherList() {
  $.ajax({
    type: "POST",
    url: "/webservices/Service.asmx/GetTeachers",
    contentType: "application/json; charset=utf-8",
    dataType: "json",
    success: function(i) {
      if (i.d) {
        console.log(i.d);
        return t._teacherOptions(i.d);
      }
    },
    error: function(n) {
      u(n);
    }
  });
}
getTeacherList();
t.TeacherOptions = ko.computed(function() {
  return t._teacherOptions();
});

请参阅文档