web-dev-qa-db-ja.com

IDでXMLフラグメントから要素にアクセスする方法

SAPUI5アプリケーションに取り組んでいます。 XML Fragment と保存するボタンを含むXMLビューがあります。

フラグメントには、ドロップダウン、テキストフィールド、テーブルなどのいくつかのコントロールが含まれています。保存ボタンを押すと、テーブル内のすべての行を取得し、OData更新サービスを呼び出す必要があります。

問題は、View ControllerのonSaveメソッドにあります。 IDを使用してテーブルにアクセスしているときにエラーが発生します。誰でも私を助けて、コントローラでIDでフラグメントで使用されるコントロールにアクセスする方法をアドバイスできますか?

コードスニペットは次のとおりです。

- - 見る

<mvc:View xmlns:mvc="sap.ui.core.mvc" xmlns:core="sap.ui.core" xmlns:form="sap.ui.layout.form" xmlns="sap.m">
  <Page>
    ...
    <form:SimpleForm>
      <core:Fragment id ="fr1" fragmentName="first" type="XML"/>
      <Button id="id1" press="onSave"/>
    </form:SimpleForm>
  </Page>
</mvc:View>

----フラグメント定義

<core:FragmentDefinition xmlns="sap.m" xmlns:core="sap.ui.core">
  <Table id="tab1" mode="MultiSelect">
    ...
  </Table>
</core:FragmentDefinition>

----コントローラー

sap.ui.controller("view", {
  onSave: function() {
    //var tab = this.getView().byId("tab1"); // Not working
    var tab  = sap.ui.getCore().byId("tab1"); // Not working
  },
  // ...
});
11
Nilesh Puranik

Githubのopenui5コードを見ると、_<Fragment/>_自体がnotに明示的なIDを持っている場合、フラグメントはローカルID生成を含むビューに委任しているようです。

したがって、_id="fr1"_属性を_<Fragment/>_要素から削除するとすぐに、コードthis.getView().byId("tab1")が機能するはずです。

明示的なIDを使用する場合、コントロールを取得する static Fragment.byId() メソッドがあります。次のように使用する必要があると思います。

_var fragmentId = this.getView().createId("fr1");
var tab = sap.ui.core.Fragment.byId(fragmentId, "tab1");
_
17
schnoedel

フラグメント内のコントロールへのアクセスは、最初にフラグメントがどのように作成されたかによって異なります。コントロール参照を取得するために使用する各APIのケースのリストは次のとおりです。

使用するAPI

this.byId("controlId");
  • フラグメントがビューIDで作成された場合:

    sap.ui.xmlfragment(this.getView().getId(), "my.Fragment", this); // deprecated *
    _<core:Fragment fragmentName="my.Fragment" type="XML" />
    <!-- View ID will be automatically propagated in XMLView -->_
  • グローバルID:_"componentId---viewId--controlId"_ **

this.byId(Fragment.createId("fragmentId", "controlId"));
  • ビューIDandaフラグメントID与えられた:

    sap.ui.xmlfragment(this.createId("fragmentId"), "my.Fragment", this); // deprecated *
    _<core:Fragment id="fragmentId" fragmentName="my.Fragment" type="XML"/>_
  • グローバルID:_"componentId---viewId--fragmentId--controlId"_ **

Fragment.byId("fragmentId", "controlId");
  • fragment IDのみの場合:

    sap.ui.xmlfragment("fragmentId", "my.Fragment", this); // deprecated *
  • グローバルID:_"fragmentId--controlId"_

sap.ui.getCore().byId("controlId");
  • IDが指定されていない場合:

    _sap.ui.xmlfragment("my.Fragment", this); // deprecated *
    // All control IDs within the fragment gets registered globally without any prefixes!!
    _
  • グローバルID:_"controlId"_


*:API _sap.ui.*fragment_は非推奨です。代わりに _Fragment.load_ を使用してください(1.58以降で使用可能)。

**:ビューに stable ID が指定されていない場合、コンポーネントIDはグローバルIDの一部になりません。その場合、グローバルIDは生成されたビューID _"__xmlview0--..."_で始まります。


与えられた

  • this:コントローラーインスタンスへの参照
  • Fragment:依存関係定義で指定された解決済みモジュールのパラメーター名

    _sap.ui.define([ // or .require
      "sap/ui/core/Fragment",
      // ...
    ], function(Fragment, /*...*/) { /*...*/});
    _

注意

  • comment および documentation で説明されているように、IDパーツを連結したり、グローバルIDの構文に依存したりしないでください。

    notは、特定のプレフィックス構文に依存します。これは、ある時点で変更される可能性があるためです。常にbyId()createId()などのメソッドを使用してください。

  • Considerは、フラグメントコントロールで使用されているデータを実際に変更することを意図している場合、上記のAPIの使用を回避します(例:myManuallyAccessedInput.setValue("..."))。代わりに data binding を使用してください。⇒モデルの変更はUIに自動的に反映されます。
19

明示的なフラグメントIDと静的なFragment.byId()を使用せずに機能させるには、次のコードスニペットを使用しました。

var prefix = this.getView().createId("").replace("--", "");
var fragment = sap.ui.xmlfragment(prefix, "-- XML fragment name --", this);

この後、他のコントロールと同様にthis.getView()。byId( "tab1")を使用できます。

2
slkorolev