Reputation: 1
so here my problem is that I want knockout's foreach to display my computed array of objects in descending order according to one value per object (totalTTC of Order). And I dont want this order to change even if the totalTTC in an order change when user change stuff. But the sorting is updating each time a change is made and I dont know how to disable this. Here is my computed:
appViewModel.orders = ko.computed(() -> (
orders = []
# Check if seller of this shoppingCartLine exists
appViewModel.shoppingCartLines().forEach((shoppingCartLine) ->
existingOrder = null
orders.forEach((order) ->
if order.seller? and order.seller.id() == shoppingCartLine.ad.ownerJson.id()
existingOrder = order
)
# If it exits add it to its shoppingCartLines array
if existingOrder?
existingOrder.shoppingCartLines.push(shoppingCartLine)
return
# Otherwise create a new order from this shoppingCartLine
else
seller = shoppingCartLine.ad.ownerJson
shoppingCartLines = ko.observableArray([shoppingCartLine])
order = new Order(seller, shoppingCartLines, appViewModel.freeShippingFeesThreshold)
orders.push(order)
return
)
return orders
))
And here is my html:
<div data-bind="foreach: {data: orders().sort(function (o, r) { return r.totalHT() > o.totalHT() ? 1 : -1 }), as: 'order'}">
I just want the sorting function to be triggered once.
Upvotes: 0
Views: 535
Reputation: 178
Since you said you do not need knockout to update when orders are add/removed, and don't need to update the sorting, orders does not need to be an observable.
Personally I'd also sort it in the viewModel. I like the markup to contain as little code as possible.
appViewModel.orders = computeOrders().sort(function (o, r) { return r.totalHT() > o.totalHT() ? 1 : -1 });
function computeOrders() {
# Check if seller of this shoppingCartLine exists
appViewModel.shoppingCartLines().forEach((shoppingCartLine) ->
existingOrder = null
orders.forEach((order) ->
if order.seller? and order.seller.id() == shoppingCartLine.ad.ownerJson.id()
existingOrder = order
)
# If it exits add it to its shoppingCartLines array
if existingOrder?
existingOrder.shoppingCartLines.push(shoppingCartLine)
return
# Otherwise create a new order from this shoppingCartLine
else
seller = shoppingCartLine.ad.ownerJson
shoppingCartLines = ko.observableArray([shoppingCartLine])
order = new Order(seller, shoppingCartLines, appViewModel.freeShippingFeesThreshold)
orders.push(order)
return
)
return orders
}
HTML:
<div data-bind="foreach: orders">
Upvotes: 0