2017-11-07 10 views
0

"SAP Fiori Master-Detail Application"템플릿을 사용하여 SAPUI5 응용 프로그램을 생성했습니다. 마스터 및 세부 정보 페이지가 제대로 작동하고 OData 서비스에 제대로 연결되어 있습니다. 내가 지금하려고하는 것은 Detail 페이지를 두 번째 (다른) Detail 페이지로 라우팅하는 것입니다.SAPUI5 : 키의 변형 된 URI 리터럴 구문

첫 번째 세부 정보 페이지 (Detail1)에는 Detail2 개체 목록이 포함되어 있습니다. 목록에있는 해당 개체 중 하나를 클릭하면 Detail2 페이지로 이동하게됩니다 (더 많은 정보가 표시됨).

WebIDE를 사용하여 새로운 Detail2 View 및 Controller를 작성 했으므로 필러 코드가 포함되어 있습니다. 두 개의 매개 변수 당신이 패턴에서 볼 수 있듯이

{ 
    "name": "detail2Object", 
    "pattern": "Detail2(Master={masterId},Id={detail1Id})", 
    "titleTarget": "", 
    "greedy": false, 
    "target": ["master", "detail2"] 
} 

"detail2Object": { 
    "viewType": "XML", 
    "transition": "slide", 
    "clearAggregation": true, 
    "viewName": "Detail2", 
    "title": "", 
    "viewId": "detail2page", 
    "viewLevel": 3 
} 

, 서비스가 필요 : 나는 또한 manifest.json을 파일에 새로운 경로를 만들어 마스터 및 ID (마스터 ID이며, 최초의 결함 Id)을 .

잘 내 응용 프로그램 데이터를 반환에서 독립적 인 서비스를 테스트 :

http://{root}.com:{port}/sap/opu/odata/sap/TEST_SRV/Detail2(‌​Master='552364',Id='‌​0004') 나는 마스터에 전달하는 내 Detail1 컨트롤러에 NavTo 기능을 생성 및 ID 매개 변수 :

_onNav : function (oEvent) { 
      // get the list item, either from the listItem parameter or from the event's source itself (will depend on the device-dependent mode). 
      this._showDetail2(oEvent.getParameter("listItem") || oEvent.getSource()); 
}, 

_showDetail2 : function (oItem) { 
      this.getRouter().navTo("detail2Object", { 
       masterId: oItem.getBindingContext().getProperty("Master"), 
       detail1Id: oItem.getBindingContext().getProperty("Id") 
      }); 
} 

나는를 실행하면 Detail1 페이지의 Detail2 객체를 클릭하면 WebIDE 테스트 (라이브 OData 및 내가 만든 Mockdata 모두)를 통해 다음과 같은 오류를 표시하는 새 페이지로 이동합니다.

This <"ObjectName"> is not available

,451,515,

F12 도구로 가는데, 나는 다음과 같은 오류를 참조하십시오, 많은 연구를 통해 유일한 일을

http://localhost:54634/webapp/test/mockServer.html?hc_reset&origional-url=mockServer.html&sap-ui-appCacheBuster=..%2F..%2F..%2F&sap-ui-xx-componentPreload=off#/Detail2(Master= '552364',Id='0004')

이 URL이 제대로 매개 변수를 뽑아에도 불구하고 발생하는

MockServer: Malformed URI literal syntax in key 'Id' -

HTTP request failed400,Bad Request,{"error":{"code":400,"message":{"lang":"en","value":"Malformed URI literal syntax in key 'Id'"}}} -

이 오류는 메타 데이터 파일과 관련이있을 수 있습니다. 그러나 이드는 모두 Edm.String이고 철자가 똑같은 방식이므로 철자가 맞지 않습니다. 또한 앞에서 설명한 것처럼 응용 프로그램과 독립적으로 실행되는 동일한 매개 변수로 서비스가 잘 실행됩니다.

도움을 주시면 감사하겠습니다. Detail2 객체의 목록을 포함

업데이트

Detail1보기 :

 <List noDataText="Drop list items here" id="__list0" items="{DetailToDetail2}" headerText="Defects"> 
      <items> 
       <ObjectListItem type="Navigation" title="{Detail2Title}" number="{Qty}" numberUnit="Detail Qty" press="_onNav"> 
       <attributes> 
        <ObjectAttribute text="{Detail2_Attr}" id="__attribute11" title="Detail2 Attr"/> 
        <ObjectAttribute id="__attribute12" title="Detail2 Attr2" text="{Detail2_Attr2}"/> 
       </attributes> 
       </ObjectListItem> 
      </items> 
     </List> 

item="{DetailToDetail2}" 서비스의 메타 데이터에 NavigationProperty 및 협회로 나타납니다.그것은 Detail1 엔티티에 어떻게 보이는지

이입니다

<NavigationProperty Name="DetailToDetail2" Relationship="TEST_SRV.DetailToDetail2" FromRole="FromRole_DetailToDetail2" ToRole="ToRole_DetailToDetail2"/> 

이 전체 Detail2 법인 인 다음 DetailToDetail2 협회

 <EntityType Name="Detail2" sap:content-version="1"> 
      <Key> 
       <PropertyRef Name="Id"/> 
       <PropertyRef Name="Master"/> 
      </Key> 
      <Property Name="Id" Type="Edm.String" Nullable="false" MaxLength="4" sap:unicode="false" sap:label="Id" sap:creatable="false" sap:updatable="false" sap:sortable="false" sap:filterable="false"/> 
      <Property Name="Master" Type="Edm.String" Nullable="false" MaxLength="12" sap:unicode="false" sap:label="Master" sap:creatable="false" sap:updatable="false" sap:sortable="false" sap:filterable="false"/> 
      <Property Name="Attr1" Type="Edm.String" MaxLength="40" sap:unicode="false" sap:label="Attribute 1" sap:creatable="false" sap:updatable="false" sap:sortable="false" sap:filterable="false"/> 
      <Property Name="Qty" Type="Edm.Int32" sap:unicode="false" sap:label="Detail Qty" sap:creatable="false" sap:updatable="false" sap:sortable="false" sap:filterable="false"/> 
      <Property Name="Attr2" Type="Edm.String" MaxLength="40" sap:unicode="false" sap:label="Attribute 2" sap:creatable="false" sap:updatable="false" sap:sortable="false" sap:filterable="false"/> 
      <Property Name="Attr3" Type="Edm.String" MaxLength="4" sap:unicode="false" sap:label="Attribute 3" sap:creatable="false" sap:updatable="false" sap:sortable="false" sap:filterable="false"/> 
     </EntityType> 

그리고 여기에 있습니다 :

 <Association Name="DetailToDetail2" sap:content-version="1"> 
      <End Type="TEST_SRV.Detail1" Multiplicity="1" Role="FromRole_DetailToDetail2"/> 
      <End Type="TEST_SRV.Detail2" Multiplicity="*" Role="ToRole_DetailToDetail2"/> 
      <ReferentialConstraint> 
       <Principal Role="FromRole_DetailToDetail2"> 
        <PropertyRef Name="Id"/> 
       </Principal> 
       <Dependent Role="ToRole_DetailToDetail2"> 
        <PropertyRef Name="Master"/> 
       </Dependent> 
      </ReferentialConstraint> 
     </Association> 
+0

발생하는 오류는 OData 형식이며 라우팅 자체와는 거의 관련이 없습니다. 보기 2의 탐색기 처리기를 보여주십시오. 가장 일반적인 문제는 바인딩 경로/odata URL 구성에 있습니다. Pls. 또한 잘못된 URI를 생성 한 잘못된 서비스 URL을 게시합니다. – cschuff

+0

문제가 라우팅이 아닌 OData에서 비롯된 것입니다. 문제가있는 곳이 좁혀집니다. 내 서비스 메타 데이터에 대한 정보를 추가했습니다. 어쩌면 우리가 응용 프로그램과 독립적으로 서비스를 테스트 할 때 호출하지 않는 것이 문제 일 수 있습니다. –

+0

잘못 구성된 URI 오류가 발생한 잘못된 서비스 URL은 위에 게시 한 localhost url입니다. http : // localhost : 54634/webapp/test/mockServer.html? hc_reset & origional-url = mockServer.html & sap-ui-appCacheBuster =. % 2F .. % 2F .. % 2F & sap-ui-xx-componentPreload = off #/Detail2 (Master = '552364', Id = '0004') –

답변

0

I "잘못된 URI"오류가 라우팅이나 탐색에서 발생하지 않았지만 bindin을 통해 발견되었습니다. g 페이지로 이동 한 후

내 Detail2 컨트롤러는 _onObjectMatched 기능은 다음과 같이 보았다 : 디버깅을 통해

_onObjectMatched : function (oEvent) { 
     var sObjectMasterId = oEvent.getParameter("arguments").masterId; 
     var sObjectDetailId = oEvent.getParameter("arguments").detail1Id; 
     this.getModel().metadataLoaded().then(function() { 
      var sObjectPath = this.getModel().createKey("Detail2", { 
      masterId: sObjectMasterId, 
      detail1Id : sObjectDetailId 
      }); 
      this._bindView("/" + sObjectPath); 
     }.bind(this)); 

은 내가 sObjectPath 변수가 Detail2(Id=null, Master=null)로 설정되는 것을 발견했다. 즉, masterIddetail1Id은 올바른 매개 변수 이름이 아니므로 경로에 바인딩하지 않았으므로 경로에 바인딩됩니다. 그래서 IdMasterdetail1IdmasterId을 대체 :

_onObjectMatched : function (oEvent) { 
    var sObjectMasterId = oEvent.getParameter("arguments").masterId; 
    var sObjectDetailId = oEvent.getParameter("arguments").detail1Id; 
    this.getModel().metadataLoaded().then(function() { 
     var sObjectPath = this.getModel().createKey("Detail2", { 
     Master: sObjectMasterId, 
     Id: sObjectDetailId 
     }); 
     this._bindView("/" + sObjectPath); 
    }.bind(this)); 

짜잔, 그것은했다!

답장을 보내고 라우팅에서 나와 구속력을 향해 나를 가리켜 주신 모든 분들께 감사드립니다. "잘못된 URI"오류가 발생하는 모든 사람에게 모든 바인딩과 탐색을 검토하여 모든 매개 변수의 철자가 올바른지 확인하는 것이 좋습니다.

Routing with Parameters 자습서를 검토하는 것도 중요한 도움이되었습니다.