我遇到了一个严重的问题,在轻微的电话中绑定了敲击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。
但我找不到更好的方法来解决它。
感谢您的反馈和建议。
答案 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。
同样,这是非常糟糕的设计,但此时我还无法找到任何其他解决方案。
希望能帮助你至少让它起作用。