在成功回叫完成之前,微风经理回复承诺

时间:2013-12-16 16:44:49

标签: knockout.js

我遇到了一个严重的问题,在轻微的电话中绑定了敲击observableArray。

在此处发布我的代码......

function objCart(object_id,
             brand_name, model_name,
             size, name, imagepath,
             brand_imagepath, model_imagepath,
             quantity, offerAmount, showCartProductImage) {

    this.object_id = ko.observable(object_id);
    this.brand_name = ko.observable(brand_name);
    this.model_name = ko.observable(model_name);
    this.size = ko.observable(size);
    this.name = ko.observable(name);
    this.imagepath = ko.observable(imagepath);
    this.brand_imagepath = ko.observable(brand_imagepath);
    this.model_imagepath = ko.observable(model_imagepath);
    this.quantity = ko.observable(quantity);
    this.offerAmount = ko.observable(offerAmount);
    this.showCartProductImage = ko.observable(showCartProductImage);
    this.editEnable = ko.observable(false);
    this.showEdit = ko.observable(true);
    this.showCancel = ko.observable(false);
    this.cancelEdit = ko.observable(false);
    this.offerEdit = function () {
        if (!this.editEnable()) {
            this.editEnable(true);
            this.showCancel(true);
            this.showEdit(false);
            gCartEditQuantity = this.quantity();
            gCartEditOfferAmount = this.offerAmount();
        }
    }
    this.CancelEdit = function () {

        this.editEnable(false);
        this.showEdit(true);
        this.showCancel(false);
        this.quantity(gCartEditQuantity);
        this.offerAmount(gCartEditOfferAmount);

    }

    this.offerUpdate = function () {

        this.editEnable(false);
        this.showEdit(true);
        this.showCancel(false);         
        UpdateCart(this.object_id, this.quantity, this.offerAmount, vm.customerId);

    }

    this.offerDelete = function () {
        DeleteCart(this.object_id, this.quantity, this.offerAmount, vm.customerId);
        // cartItems.remove(this);
    }


    this.ShowItemDetailsModal = function () {

        getItemDetails(this.object_id);
        modaldialog.show(detailsView).then(function () {
            //logger.log('Modal Closed', null, 'home', true);
        });

    }


    this.ShowBrandDetailsModal = function () {

        getBrandDetails(this.object_id);
        modaldialog.show(brandDetails).then(function () {
            //logger.log('Modal Closed', null, 'home', true);
        });

    }

}

按如下方式拨打服务器以获取数据......

function getCartItems(customerId) {

    var query = breeze.EntityQuery.
            from("getCart")
            .withParameters({ CustomerId: customerId
            })
            .orderBy("name");
    var promise = manager
        .executeQuery(query)
        .then(querySucceeded)
        .fail(queryFailed);

    function querySucceeded(data) {

        vm.cartItems([]);
        var temp = [];
        for (var i = 0; i < data.results.length; i++) {
            var crt = new objCart(data.results[i].object_id,
                               data.results[i].brand_name,
                               data.results[i].model_name,
                               data.results[i].size,
                               data.results[i].name,
                               data.results[i].imagepath,
                               data.results[i].brand_imagepath,
                               data.results[i].model_imagepath,
                               data.results[i].quantity,
                               data.results[i].offerAmount,
                               data.results[i].showCartProductImage);
            temp.push(crt);


        }

        vm.cartItems(temp);
        vm.cartItems.valueHasMutated();
        if (vm.cartItems().length > 0) {

            itemsInCart(true);
            checkoutDisplay(true);
        }
        else {

            itemsInCart(false);
            checkoutDisplay(false);
        }

    }

    function queryFailed(error) {
        toastr.error("Query failed: " + error.message);
    }

    return promise;
};

问题是 - 当第一次加载视图时,即使cartItems()中有项目,列表也不显示任何内容;

对于后续的routernavigates,它显示上一次调用中viewmodel中的项目列表

我认为问题是因为breeze管理器在成功回调映射实体之前返回promize。

但我找不到更好的方法来解决它。

感谢您的反馈和建议。

1 个答案:

答案 0 :(得分:0)

我没有一个很好的答案,但也许是想解决它。我希望有人有答案,因为我也需要它。

我遇到了在绑定到observable的数据之前promise返回的相同问题。唯一的解决方案是&#34;在数据绑定到observable之后,我可以想出在数据访问层中使用JQuery来绑定或执行我需要做的事情。 这是一个可怕的设计,违背了每个代码分离,但我根本找不到另一种方法来使它工作。

在这个例子中,我必须在数据绑定后调用一个更改函数。

代码如下所示:

在虚拟机中呼叫:

datacontext.getProduct(productObservable, productSearch.Id());

数据访问层(datacontext):

function getProduct(productObservable, id) {
        query = "Product/Get/" + id;

        $('#loading-indicator').show();
        return newPricingEm().executeQuery(query)
            .then(querySucceeded)
            .fail(queryFailed)

        function querySucceeded(data) {
            $('#loading-indicator').hide();
            ko.mapping.fromJS(data.results[0], {}, productObservable);
            // Should not be in here
            $('#productCategory').change();
            log("Retrieved [Product] from remote data source",
                data, true);
        }
    }

注意:

        ko.mapping.fromJS(data.results[0], {}, productObservable);
        // Should not be in here
        $('#productCategory').change();

$(&#39; #productCategory&#39;)。change(); 正在触发绑定数据后需要触发的事件。

因此,在您的情况下,您可以使用JQuery在此步骤中将observable绑定到View。

同样,这是非常糟糕的设计,但此时我还无法找到任何其他解决方案。

希望能帮助你至少让它起作用。