我在这里按照教程:
Computed Properties With the LightSwitch HTML Client (lightswitchhelpwebsite.com)
以下是教程代码:
myapp.AddEditFlowerShopOrder.NumberOfDetails_postRender = function (element, contentItem) {
function updateTotal() {
// Compute the total for the Order
contentItem.screen.TotalOfOrders =
TotalOrders(contentItem.screen.FlowerShopOrderDetail);
}
// Set a dataBind to update the value when the collection changes
contentItem.dataBind("screen.FlowerShopOrderDetail.count", updateTotal)
};
// Function to compute the total for the Order
function TotalOrders(OrderDetails) {
// Start with 0
var TotalAmountOfOrders = 0;
// Get the data for the collection passed
var OrderDetail = OrderDetails.data;
// Loop through each row
OrderDetail.forEach(function (order) {
// Add each row to TotalAmountOfOrders
TotalAmountOfOrders = TotalAmountOfOrders +
(order.Quantity * order.FlowerShopProduct.Price);
});
// Return TotalAmountOfOrders
return TotalAmountOfOrders;
}
这是我的代码:
myapp.AddEditOrder.Order_Subtotal_postRender = function (element, contentItem) {
//Write code here.
function subtotalDetails() {
contentItem.screen.Order.Subtotal =
TotalOrderDetails(contentItem.screen.OrderDetails);
}
subtotalDetails();
//contentItem.dataBind("screen.OrderDetails.count", subtotalDetails(contentItem));
};
function TotalOrderDetails(details) {
var subtotal = 0;
var detail = details.data;
detail.forEach(function (order) { subtotal = subtotal + order.Total; });
return subtotal;
}
我无法使dataBind绑定,它说它无法返回调用。所以我把它评论出来并且只调用一次,当它呈现其余的代码时。我不知道.data成员是如何工作的,但是如果我将detail.forEach更改为for,它就不会遍历ProductDetails的ProductDetail对象的集合。
为了澄清,我有这些表:Order> - OrderDetails。我的目标是绑定Order.Subtotal = Order.OrderDetail的总和(所有项目)。总计。
答案 0 :(得分:1)
我在代码和演示中看到的差异是,演示使用Screen属性来保存小计(screen.TotalOfOrders),而您显然是在尝试更改Order记录中的Subtotal字段(screen.Order) .Subtotal)。请记住,要从子记录访问父表中的字段,您需要使用screen。 data .fieldnameyouwant而不是screen。 ParentTable .fieldname。我知道第二种方式似乎是合乎逻辑的事情,但Lightswitch并不这么认为。
我会尝试制作一个名为DetailTotal的屏幕属性,就像演示一样,然后等到屏幕的验证事件触发并更新那里的父记录小计。这样,在您离开屏幕之前,实际上没有任何内容写入父级。
myapp.AddEditOrder.beforeApplyChanges = function (screen) {
// Write code here.
var targetOrder = screen.findContentItem("Order_Subtotal");
targetOrder.data.Subtotal = screen.DetailTotal;
};