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 而不执行它?