New API For Refreshing Data in LightSwitch in Visual Studio 2013
You can get Visual Studio 2013 here: http://www.microsoft.com/visualstudio/eng/2013-downloads.
The Sample Project
When we open it up, it will be converted to the new Visual Studio 2013 format. However, to get it to run we have right-click on the first project
The API
The new refresh() API consists of two methods that each return a Promise object.
- Refresh()
Asynchronously loads the first page of items into this collection and returns a promise that will be fulfilled when the first page is loaded. Existing results will be refreshed on the first page and subsequent pages unless load() is called again.
- Refresh(navigationPropertyNames)
Updates the entity with values from the data source if the entity is not changed.
<param name="navigationPropertyNames" type="Array" optional="true">. An array of names of navigation properties to be included. An empty array means no properties will be included. If not specified, all reference properties are included.
Sample usage
- Refresh the Order entity and its Customer, Employee, Shipper
screen.Order.details.refresh();
- Refresh only the Order entity
screen.Order.details.refresh([]);
- Refresh the Order entity and its Customer
screen.Order.details.refresh(["Customer"]);
The Problem
Let’s say we have a field on the Order entity that is updated in the save pipeline when an associated OrderDetail record is updated.
In the OrderDetail record, the updating event looks like this:
We can update an OrderDetail record
Save the changes. But the time is unchanged on the screen (even though it has been updated in the database).
The Solution
We can instantly have the entity updated if we use the new refresh() method.
To do so requires us to implement our own code to open the edit screen (so we have an opportunity to implement the refresh code).
We select the Item Tap action for the Orders list.
Select Write my own method.
We then edit the code for the method we created.
We use the following code:
myapp.Main.Order_ItemTap_execute = function (screen) {
myapp.showAddEditOrder(null, {
beforeShown: function (addEditOrderScreen) {
// Set the Order on the AddEditOrder screen
// to the selected Order on the Main screen
addEditOrderScreen.Order = screen.Orders.selectedItem;}
},
afterClosed: function (addEditScreen, navigationAction) {
// If the user commits the change,
// update the selected order on the Main screen
if (navigationAction === msls.NavigateBackAction.commit) {
// *****************************************
// The .refresh() method refreshes the Order
screen.Orders.selectedItem.details.refresh();
}
}
});
};
When we update the record we will see the date instantly updated without the need to refresh the entire screen.