knockoutjs 调用一直在执行,我怎样才能只调用一次?

Posted

技术标签:

【中文标题】knockoutjs 调用一直在执行,我怎样才能只调用一次?【英文标题】:knockoutjs call keeps executing, how can I call it only once? 【发布时间】:2016-03-23 20:53:25 【问题描述】:

我有这段代码:

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>

由于某种原因,在打开页面时,获取教师列表的功能一直在不停地循环。

我能够得到我需要的结果,但循环仍在继续,我需要停止它。我在这里做错什么了吗?

【问题讨论】:

为什么要t.TeacherOptions 成为计算值?另外如果_teacherOption 是一个列表,为什么不使用observableArray 【参考方案1】:

因为您的TeacherOptions(这是一个computed)访问_teacherOptions(因此创建了一个依赖项)并且因为您在success 的回调中改变了_teacherOptions 的值,所以您将无休止地循环您的 Ajax 调用,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();
);

见Documentation

【讨论】:

以上是关于knockoutjs 调用一直在执行,我怎样才能只调用一次?的主要内容,如果未能解决你的问题,请参考以下文章

我怎样才能只为第一个函数调用做某事?

我怎样才能让 NHibernate 只生成 SQL 而不执行它?

怎样让一个批处理程序在后台运行啊???

我怎样才能确定每个访客的jquery ajax调用都在执行?

如何调试 KnockoutJS 的模板绑定错误?

斯威夫特:我怎样才能减少 didupdatelocation 调用