基本上,我有一个下拉选择,将有另一个下拉加载。我有一个根据第一个下拉选择的值计算的变量(我知道它可以订阅,但仍然可以)。但是计算的结果是在页面加载时执行的,这是我不想要的,因为里面有一个AJAX调用。‘页面加载时执行的原因是什么?如何避免这种情况?
HTML:
<div>
<select id="selectmenu1" data-bind="options: departments,
optionsValue: 'id',
optionsText: 'name',
optionsCaption: 'Choose...',value: selectedDept">
</select>
<select id="selectmenu1" data-bind="options: contacts,
optionsValue: 'id',
optionsText: 'name',
optionsCaption: 'Choose...'">
</select>
</div>和JS
// Here's my data model
var ViewModel = function(first, last) {
var self = this;
var deptArray = [];
var deptObj = {
id: "8888",
name: "Electrical"
};
deptArray[0] = deptObj;
deptObj = {
id: "9999",
name: "Admin"
};
deptArray[1] = deptObj;
self.departments = ko.observableArray(deptArray);
self.selectedDept = ko.observable();
self.contacts = ko.observableArray();
self.contactsRetrieve = ko.computed(function() {
var deptId = self.selectedDept();
console.log("entered");
$.ajax({
url: '/echo/js',
complete: function(response) {
console.log("success");
var contactArray = [];
var contactObj = {};
if (deptId == '8888') {
contactObj.id = '1234';
contactObj.name = 'Vivek';
} else if (deptId == '9999') {
contactObj.id = '5678';
contactObj.name = 'Sree';
}
contactArray[0] = contactObj;
self.contacts(contactArray);
}
});
console.log("exited");
});
};
ko.applyBindings(new ViewModel());发布于 2017-04-06 17:32:00
据我所知,导致这种行为的不是页面加载本身,而是计算的可观察对象依赖于其他可观察对象的事实,在您的例子中是self.selectedDept。Knockout发现计算依赖于哪些其他可观察对象,实际上是selectedDept的值的更改导致计算结果重新计算。
您无法避免这种行为,但是可以通过添加保护条件(读取:if语句)来避免执行AJAX调用。我假设您的目标是在下拉列表中没有选择任何内容的情况下阻止AJAX调用,毕竟,这是实现这一目标的最直接的方法。
没有其他方法可以绕过它,原因很简单,如果你想一想,计算机的整个目的就是在任何其他可观察到的东西依赖于变化时重新评估自己,而不需要人工干预。
发布于 2017-04-07 16:11:52
https://stackoverflow.com/questions/43251043
复制相似问题