我有以下JSON对象:
Object {domainCount: 1, preOrderCode: "something"}
我在viewModel中调用它:
this.preOrderedDomains = ko.observableArray([]);
this.hasPreOrder = function(domainSearchResult, event) {
var data = {
'preOrderCode' : this.preOrderCode,
'domainCount' : this.domainCount,
}
$.ajax('/ajax-check-preorder.do', {
data: data,
type: "post",
dataType: 'json',
success: function(result) {
if (utils.getProperty('domainCount',result, true) ) {
self.preOrderedDomains.push(domainSearchResult);
}
console.log(result);
}
});
return ko.utils.arrayFilter(self.preOrderedDomains(), function (domainCount) {
return domainCount == domainSearchResult.domainCount;
}).length;
}
它会在您刷新页面时检查是否有预订。 如果有,它应该在DOM中显示以下内容:
<div class="preOrdered" data-bind="visible: $root.domainSearch.hasPreOrder($data)">
<strong class="single_domain" data-bind="visible: $root.domainSearch.preOrderedDomains().length <= 1">
<span class="update--domain" data-bind="text: domainSearch.preOrderedDomains().length"></span> <bean:message key="site.domain.search.selected.domain" />
</strong>
<strong class="multiple_domains" data-bind="visible: $root.domainSearch.preOrderedDomains().length >= 2">
<span class="update--domain" data-bind="text: domainSearch.preOrderedDomains().length"></span> <bean:message key="site.domain.search.selected.domains" />
</strong>
</div>
当我重新加载时,如果domainCount为1,则显示第一名。但它并没有增加数量。 因此,如果在infinte循环中有2或3等结束。
有没有人知道我做错了什么?
答案 0 :(得分:1)
您将.preOrdered
div
种可见性与功能绑定在一起。不要那样做。相反,绑定到可观察或计算的observable。
第二件事就是问你自己:你最初显示隐藏div
的页面是否正常?一旦Ajax请求完成,它就会弹出?或者你想在完成之前展示什么?
在后一种情况下,您可能不应在ko.applyBindings
处理程序之前调用success
。
在任何一种情况下,我建议hasPreorder
可观察并设置其值:
var self = this;
self.preOrderedDomains = ko.observableArray([]);
self.hasPreOrder = ko.observable(false);
self.updateHasPreorder = function(domainSearchResult, event) {
var data = {
'preOrderCode' : self.preOrderCode,
'domainCount' : self.domainCount,
};
$.ajax('/ajax-check-preorder.do', {
data: data,
type: "post",
dataType: 'json',
success: function(result) {
if (utils.getProperty('domainCount',result, true) ) {
self.preOrderedDomains.push(domainSearchResult);
}
console.log(result);
var hasPreorderNew = ko.utils.arrayFilter(self.preOrderedDomains(), function (domainCount) {
return domainCount === domainSearchResult.domainCount;
}).length
self.hasPreorder(hasPreorderNew);
}
});
}
然后在您的应用中的适当时间致电self.updateHasPreorder
,例如当它第一次加载时,或者在被其他可观察者订阅时。