如何在调用saveChanges之前更新实体?

时间:2014-10-14 21:52:34

标签: breeze

我正在调用我的breezeController,从Northwind获取产品。我已经读过您可以跟踪实体的更改并保存远程服务上的所有更改,并调用 saveChanges()

我找不到的是如何更新实体属性。如何更改ProductID(1)的ProductName?

注意:我没有使用Knockout,也没有使用AngularJS。它是一个简单的HTML文件。

我打电话:

var loadProducts = function(categoryID) {
    var query = breeze.EntityQuery
        .from("Products")
        .where("CategoryID", "eq", categoryID)
        .orderBy("ProductName");

    return manager.executeQuery(query);
}

loadProducts(value).then(function (data) {
    $("#tableBody").empty();
    data.results.forEach(function (item) {
        console.log(item.ProductName);
    });
}).fail(function (error) {
    console.log(error);
});

在致电 saveChanges()之前,我需要做些什么?

EDIT =>解决方案:

我最终使用的是 getEntityByKey()来修改特定实体。

var productToModify;
managerProducts = new breeze.EntityManager(serviceName);

功能:

var loadProducts = function (categoryID) {
    var query = breeze.EntityQuery
        .from("Products")
        .where("CategoryID", "eq", categoryID)
        .orderBy("ProductName");

    return managerProducts.executeQuery(query);
}

var loadProductByID = function (productID) {
    var query = breeze.EntityQuery
        .from("Products")
        .where("ProductID", "eq", productID);

    return managerProducts.executeQueryLocally(query);
}

呼叫

// Called when clicking edit on table item. Load a form for edit
$("#tableBody").on("click", ".edit", function () {
    productToModify = $(this).closest(".trow").attr("id");
    var product = loadProductByID(productToModify);
    console.log(productToModify);

    $("#txtPN").val(product[0].ProductName);
    $("#txtSID").val(product[0].SupplierID);
    $("#txtUP").val(product[0].UnitPrice);
    $("#txtUIS").val(product[0].UnitsInStock);
    $("#txtUOO").val(product[0].UnitsOnOrder);
    $("#txtD").val(product[0].Discontinued);

    $(".table").fadeOut(200, function () {
        $("#editProduct").fadeIn(200);
    });
});

$("#btnSave").on("click", function () {
    if ($("#selectSupplier").val() === "0") {
        alert("Must select supplier");
    }
    else {
        console.log(productToModify);
        var product = managerProducts.getEntityByKey("Product", productToModify);
        product.ProductName = $("#txtPN").val();
        product.SupplierID = $("#txtSID").val();
        product.UnitPrice = $("#txtUP").val();
        product.UnitsInStock = $("#txtUIS").val();
        product.UnitsOnOrder = $("#txtUOO").val();
        product.Discontinued = $("#txtD").val();
        console.log(product.entityAspect.entityState.name);

        managerProducts.saveChanges().then(function () {
            $("#" + productToModify).children(".pn").text($("#txtPN").val());
            $("#" + productToModify).children(".psid").text($("#selectSupplier").val());
            $("#" + productToModify).children(".pup").text($("#txtUP").val());
            $("#" + productToModify).children(".puis").text($("#txtUIS").val());
            $("#" + productToModify).children(".puoo").text($("#txtUOO").val());
            $("#" + productToModify).children(".pd").text($("#txtD").val());

            $("#editProduct").fadeOut(200, function () {
                $(".table").fadeIn(200);
            });
        }).fail(function (e) {
            alert(e);
        });
    }
});

2 个答案:

答案 0 :(得分:2)

如果您有能力预先处理您的数据,就像您回复承诺一样,这就是我首先尝试的 -

data.results.forEach(function (item) {
    item.ProductName = "New Product Name";
    console.log('Changes ? - ', item.entityAspect.entityState);
});

如果您正确设置产品名称,应输出更改? - isModified

答案 1 :(得分:1)

只需将新值分配给实体:

entityToUpdate = data[0];
entityToUpdate.ProductName = 'new value' // entityToUpdate.entityAspect.entityState is updated
manager.saveChanges().then(...) // send data to the server

Breeze文档非常好:http://www.breezejs.com/sites/all/apidocs/classes/EntityManager.html#method_saveChanges