我的viewmodel根据JSON结果敲除不会增加数字

时间:2016-03-02 07:46:29

标签: javascript json knockout.js

我有以下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>&nbsp;<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>&nbsp;<bean:message key="site.domain.search.selected.domains" />
            </strong>
        </div>

当我重新加载时,如果domainCount为1,则显示第一名。但它并没有增加数量。 因此,如果在infinte循环中有2或3等结束。

有没有人知道我做错了什么?

1 个答案:

答案 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,例如当它第一次加载时,或者在被其他可观察者订阅时。