javascript - Breezejs: read odata link -


i'm trying breezejs library working sap odata service. working reading entities, i'm not able resolve linked objects.

my entitytype orgobject.

<entitytype name="orgobject" sap:content-version="1">     ...     <navigationproperty name="children" relationship="zgw_orgstructure.orgobject_to_children" fromrole="fromrole_orgobject_to_children" torole="torole_orgobject_to_children"/> </entitytype> 

i have link resolve linked orgobjects (link named children).

<association name="orgobject_to_children" sap:content-version="1">     <end type="zgw_orgstructure.orgobject" multiplicity="1" role="fromrole_orgobject_to_children"/>     <end type="zgw_orgstructure.orgobject" multiplicity="*" role="torole_orgobject_to_children"/> </association> 

so, breeze query working:

var query = new breeze.entityquery().from("orgobjects"); manager.executequery(query).then( function(data){     data.results.foreach(function (item) {         console.log(item);     }); } ).fail( ... ); 

how call "children" object?

attempt 1:

var query = new breeze.entityquery().from("orgobjects"); manager.executequery(query).then( function(data){     data.results.foreach(function (item) {         console.log(item);         /* */         var children = item.children();         /* */     }); } ).fail( ... ); 

this results in error:

message: "object [object object] has no method 'children'" 

attempt 2:

var query = new breeze.entityquery().from("orgobjects"); manager.executequery(query).then( function(data){     data.results.foreach(function (item) {         console.log(item);         /* */         item.entityaspect.loadnavigationproperty("children").then(function(data) {             console.log(data.results);             data.results.foreach(function (item) {                 console.log( item );             });         }).fail(             function(e){                 console.log(e);             }         );         /* */     }); } ).fail( ... ); 

this results in error:

message: "the 'propertyorexpr' parameter  must 'string'" 

attempt 3:

var query = new breeze.entityquery().from("orgobjects").expand("children"); manager.executequery(query).then( function(data){     data.results.foreach(function (item) {         console.log(item);         /* */         console.log( item.children );     console.log( item.children.length );         /* */     }); } ).fail( ... ); 

result: item.children object. buth item.children.length = 0. when check http response children fetched server, not available in item.children object.

console output:

finance department [parententity: object, navigationproperty: ctor, arraychanged: ctor, _addsinprocess: array[0], push: function…]     _addsinprocess: array[0]     _geteventparent: function () {     _getpendingpubs: function () {     arraychanged: ctor     length: 0     load: function (callback, errorcallback) {     navigationproperty: ctor     parententity: object     pop: function () {     push: function () {     shift: function () {     splice: function () {     unshift: function () {     __proto__: array[0] 0 

who can me out? there missing in odata service?

thanks, joachim

problem "solved".

1->n relations in breeze can used if inverse property (n->1) defined. far know not possible in sap gateway define inverse relation. test created 2 relationships:

<association name="orgobject_to_children" sap:content-version="1">     <end type="zgw_orgstructure.orgobject" multiplicity="1" role="fromrole_orgobject_to_children"/>     <end type="zgw_orgstructure.orgobject" multiplicity="*" role="torole_orgobject_to_children"/> </association> <association name="orgobject_to_children_inverse" sap:content-version="1">     <end type="zgw_orgstructure.orgobject" multiplicity="*" role="fromrole_orgobject_to_children_inverse"/>     <end type="zgw_orgstructure.orgobject" multiplicity="1" role="torole_orgobject_to_children_inverse"/> </association> 

then changed in breezejs

function updatecrossentityrelationship(np) {     var metadatastore = np.parenttype.metadatastore;     var incompletetypemap = metadatastore._incompletetypemap;      // ok not find yet     var targetentitytype = metadatastore._getentitytype(np.entitytypename, true);     if (targetentitytype) {         np.entitytype = targetentitytype;     }      var assocmap = incompletetypemap[np.entitytypename];     if (!assocmap) {         addtoincompletemap(incompletetypemap, np);     } else {         var inverse = assocmap[np.associationname];          /* enable inverse relationship sap gateway */         // search inverse links         if( !inverse ){             var associationname = "";             if(np.associationname.indexof("_inverse") > 0){                 associationname = np.associationname.replace("_inverse", "");             }else{                  associationname = np.associationname + "_inverse";             }             inverse = assocmap[associationname];         }         /* end enable inverse relationship sap gateway */          if (inverse) {             removefromincompletemap(incompletetypemap, np, inverse);         } else {             addtoincompletemap(incompletetypemap, np);         }     } }; 

but didn't solve everything, there other thing had change work. don't know if bug or if related sap gateway.

function mergerelatedentitiescore(rawentity, navigationproperty, parsecontext) {     var relatedrawentities = rawentity[navigationproperty.nameonserver];     if (!relatedrawentities) return null;      // needed if returned not array , expect 1 - happens __deferred in odata.     /* original code      if (!array.isarray(relatedrawentities)) return null;      var relatedentities = relatedrawentities.map(function(relatedrawentity) {         return visitandmerge(relatedrawentity, parsecontext, { nodetype: "navpropitem", navigationproperty: navigationproperty });     });      return relatedentities;     end original code */      if (!array.isarray(relatedrawentities.results))          return null;      relatedrawentities.results = relatedrawentities.results.map(function(relatedrawentity) {         return visitandmerge(relatedrawentity, parsecontext, { nodetype: "navpropitem", navigationproperty: navigationproperty });     });      return relatedrawentities.results;  } 

i tested reading operations. later on i'll check update operations.

kr, joachim


Comments

Popular posts from this blog

node.js - Bad Request - node js ajax post -

Why does Ruby on Rails generate add a blank line to the end of a file? -

keyboard - Smiles and long press feature in Android -