Skip to Content
0

Updating an item counter for a Cart button

May 03 at 03:12 PM

114

avatar image

Hi,

I am implementing a cart function into my UI5 app to collect a collection of items for further processing. My cart works fine as a feature in my Master-Detail app.

One thing I'd like to add is a counter next to the cart button to inform the user how many items currently are in the cart. My Gateway service happily returns the correct value when I use the $count option. So far, so good.

What I'm struggling with is the

  1. the correct location to update the counter next to the button
  2. retrieving the oData response

re 1: I decided to retrieve the counter within the onBeforeRendering method. Although I am happy to listen to any advice here.

re 2: I am using the code below.

onBeforeRendering: function() {
	var oCountModel = new sap.ui.model.odata.v2.ODataModel("<oData GW service>");

	oCountModel.read("/cartSet/$count", {
		method: "GET",
		async:false,
		success: function(data) {
			var response = (JSON.stringify(data));
				},
		error: function() {
				}
	});
},

The above code call the service synchronous, but doesn't return the service response ("data is undefined"). However, I can see the response later in the Network tab in Chrome.

So basically, the service works and is called, but for some reason I can't seem to get the resulting response.

Any ideas/hints where I am going wrong with this?

10 |10000 characters needed characters left characters exceeded
* Please Login or Register to Answer, Follow or Comment.

4 Answers

Tarun Jain May 04 at 06:16 AM
1

Hi Michael,

You can define your model in manifest.json and call following in onInit method of your controller. Otherwise you can also call in component.js .

oResult directly returns a integer value which you can bind to local json model.

 var	oViewModel = new JSONModel({
				cartCount:"",
			});
	this.setModel(oViewModel, "appView");

this.getOwnerComponent().getModel("cartItems").read("/CartItems/$count",{
 success: function(oResult){
 oViewModel.setProperty("/cartCount", oResult);
   }
  });

Bind the local json model property to Cart Button

<Button id="cartBtn" press="onShoppingCartPressed" icon="sap-icon://cart" type="Emphasized" text="{appView>/cartCount}"

Show 1 Share
10 |10000 characters needed characters left characters exceeded

Just realised I replied to my original post and not your answer. Anyways... :-)

0
Tarun Jain May 04 at 01:15 PM
0

Hi Michael,

Did you map the datasource to a model in ur manisfeat.json ?

Regards,

Tarun

Share
10 |10000 characters needed characters left characters exceeded
Andre Fischer
May 04 at 03:33 PM
0

Have you tried transaction /n/iwfnd/traces to find out how the http request looks like that is received by the SAP Gateway system?

Regards,

Andre

Share
10 |10000 characters needed characters left characters exceeded
Michael Koch May 04 at 09:54 AM
0

Hi Tarun

First of all Thank You for your reply.

I have added your suggested code to my onInit method like this:

onInit: function() {
	var oViewModel = new JSONModel({
	busy: false,
	delay: 0,
	cartCount: ""
	});
//(..omitted code..)
        this.setModel(oViewModel, "detailView");
	this.getOwnerComponent().getModel().read("/cartSet/$count", {
		success: function(oResult) {
			oViewModel.setProperty("/cartCount", oResult);
			}
		});
	},

Model in manifest.json now looks like this:

"data": {
	"dataSource": "MY_SRV",
	"preload": false,
	"settings" : {
        	"useBatch" : false
        }
}

detailView.xml

<m:Button text="{data>/cartCount}" type="Default"  icon="sap-icon://cart" iconFirst="true" width="auto" enabled="true" visible="true" press="_onButtonCart"/>

The Network message response in Chrome looks like this:

Chrome Console tells me: "Resource not found for the segment 'cartSet' ", which seems to suggest that there is a mismatch with my metadata, but I can't see why. I've also tried to supply service parameters, like: Resource not found for the segment 'cartSet(Username=xyz',ItemNo=1)', which the service accepts. But this led to the same response in the console (yet works in the GW client).

Here is the successful response when I test my GW service with the $count parameter. I have also tried providing the service parameters (key and item number) with the service, which are not required as per the coding of the GW service. But this didn't make a difference.

GW Client

Hope this sheds a little more light on this. Any further help appreciated.

Thanks again,

M


chrome-error.jpg (80.2 kB)
gw-client.jpg (157.3 kB)
Show 2 Share
10 |10000 characters needed characters left characters exceeded

Hi Michael,

Did you map the datasource to a model in ur manisfeat.json ?

Regards,

Tarun

0

I see that your model name is data.. you should add model name during .getModel()

this.getOwnerComponent().getModel("data").read("/cartSet/$count", 

Also, buttontext should be mapped to json model detailView.

0