首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >微风管理器在成功回调完成之前返回承诺

微风管理器在成功回调完成之前返回承诺
EN

Stack Overflow用户
提问于 2013-12-17 00:44:49
回答 1查看 109关注 0票数 1

在绑定微风调用的敲除observableArray时,我遇到了一个严重的问题。

在这里发布我的代码...

代码语言:javascript
复制
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);
        });

    }

}

如下所示进行服务器调用以获取数据...

代码语言:javascript
复制
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()中有项;

对于后续的routernavigate,它会在上一次调用中显示带有viewmodel中项目的列表

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

但我找不到更好的方法来解决这个问题。

感谢您的反馈和建议。

EN

回答 1

Stack Overflow用户

发布于 2014-06-20 01:48:28

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

我遇到了同样的问题,即promise在绑定到可观察对象的数据之前返回。我能想到的唯一“变通办法”是在数据访问层中使用JQuery,在数据绑定到可观察对象之后,绑定或执行我需要做的任何事情。这是一个可怕的设计,违背了每一个代码分离,但我就是找不到另一种方法来让它工作。

在本例中,我必须在绑定数据后调用一个change函数。

代码如下所示:

在VM中调用:

代码语言:javascript
复制
datacontext.getProduct(productObservable, productSearch.Id());

数据访问层(datacontext):

代码语言:javascript
复制
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);
        }
    }

注意:

代码语言:javascript
复制
        ko.mapping.fromJS(data.results[0], {}, productObservable);
        // Should not be in here
        $('#productCategory').change();

在绑定数据之后,$('#productCategory').change();将触发我需要触发的事件。

因此,在本例中,您可以在此步骤中使用JQuery将可观察对象绑定到视图。

再说一次,这是非常糟糕的设计,但我在这一点上找不到任何其他的解决方案。

希望这至少能帮助你让它正常工作。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/20616112

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档