美文网首页
UI5_Walkthrough_2

UI5_Walkthrough_2

作者: LiuliuZhang | 来源:发表于2017-05-16 15:16 被阅读0次

    Pages and Panels

    将前面app的xml内容放到Panel中,并将Panel放到Page中,设置displayBlock="true"可以更适应全屏工作的高度。

       <App>
          <pages>
             <Page title="{i18n>homePageTitle}">
                <content>
                   <Panel
                      headerText="{i18n>helloPanelTitle}">
                      <content>
                         <Button
                            text="{i18n>showHelloButtonText}"
                            press="onShowHello"/>
                         <Input
                            value="{/recipient/name}"
                            description="Hello {/recipient/name}"
                            valueLiveUpdate="true"
                            width="60%"/>
                      </content>
                   </Panel>
                </content>
             </Page>
          </pages>
       </App>
    

    Page与Panel的界面如下


    Shell Control

    使用Shell Control作为应用的root容器,Shell在界面上引用了letterbox,可以使得应用能更好视频屏幕视觉。
    在index文件中将原来新建ComponentContainer的代码改成如下,放到Shell中, Shell control可以作为应用的根元素

                new sap.m.Shell({
                   app : new sap.ui.core.ComponentContainer({
                      name : "sap.ui.demo.wt",
                      height : "100%"
                   })
                }).placeAt("content");
    

    Shell Control如下,全屏后,APP内容放在中间部分


    Margins and Paddings

    将Panel设置class="sapUiResponsiveMargin" width="auto",可以看到内容与边框之间有一定的边缘Margin,并且是响应式的,随着屏幕大小的改变,Margin的大小也自动在变。在Button及Text元素中,可以设置class="sapUiSmallMarginEnd"或者class="sapUiSmallMargin来设置元素间的边缘Margin。

    Custom CSS

    定义css文件/css/style.css,其中1rem为16px。

    .myAppDemoWT .myCustomButton.sapMBtn {
      margin-right: 1rem
    }
    .myAppDemoWT .myCustomText {
      font-weight: bold;
    }
    

    在manifest.json中引入css文件资源
    在view中,app标签上<App class="myAppDemoWT">Button标签class="myCustomButton"这样可以定位到自定义的样式,在Text标签上class ="sapUiSmallMargin sapThemeHighlight-asColor myCustomText"加入自定义myCustomText样式

    Nested Views

    新建xml view,将原来app view的Panel中的内容移到新的HelloPanel View,并新建与之对应的controller。原来的App view中,content标签中通过<mvc:XMLView viewName="sap.ui.demo.wt.view.HelloPanel"/>引用Nested View。
    由于Nested View,原来上面的custom css文件中css选择器选择不到相应的类,需要修改

    Dialogs and Fragments

    Fragments是轻量级的UI部件,没有独立的controller,可以在多个view中共用。定义一个button,在上面定义press="onOpenDialog"事件,在controller中定义onOpenDialog事件的实现,通过sap.ui.xmlfragment创建fragment,其中id为HelloPanel view的ID,将dialog添加为view的adependent,生命周期将于view一样。

          onOpenDialog : function () {
             var oView = this.getView();
             var oDialog = oView.byId("helloDialog");
             // create dialog lazily
             if (!oDialog) {
                // create dialog via fragment factory
                oDialog = sap.ui.xmlfragment(oView.getId(), "sap.ui.demo.wt.view.HelloDialog");
                oView.addDependent(oDialog);
             }
            oDialog.open();
          }
    

    新建HelloDialog.fragment.xml

    <core:FragmentDefinition
       xmlns="sap.m"
       xmlns:core="sap.ui.core" >
       <Dialog
          id="helloDialog"
          title="Hello {/recipient/name}">
       </Dialog>
    </core:FragmentDefinition>
    

    Fragment Callbacks

    Fragments没有独立controller来处理事件,sap.ui.xmlfragment的第三个参数传入处理事件的controller,
    可以直接oDialog = sap.ui.xmlfragment(oView.getId(), "sap.ui.demo.wt.view.HelloDialog", this)this为当前HelloPanel Controller。定义onCloseDialog事件的实现this.getView().byId("helloDialog").close();

    Icons

    图标通过sap-icon://<iconname>.来访问。在button上可以icon="sap-icon://world",在dialog fragment中,在content标签内可以添加Icon Control

    <core:Icon
      src="sap-icon://hello-world"
      size="8rem"
      class="sapUiMediumMargin"/>
    

    Reuse Dialogs

    前面我们将Dialog Fragment的交互代码写在HelloPanel Controller中,我们要复用这个Dialog Fragment时,需要将代码写在Component.js这个公共模块下。首先定义模块HelloDialog.js,继承SAPUI5 Base Object,构造方法传入view,open事件中,由于没有controller传入,我们定义local的oFragmentController对象,里面包含了onCloseDialog事件,新建oDialog时,将oFragmentController对象作为第三个参数传入,

    sap.ui.define([
        "sap/ui/base/Object"
    ], function (UI5Object) {
        "use strict";
        return UI5Object.extend("sap.ui.demo.wt.controller.HelloDialog", {
            constructor : function (oView) {
                this._oView = oView;    
            },
            open : function () {
                var oView = this._oView;
                var oDialog = oView.byId("helloDialog");
                if (!oDialog) {
                    var oFragmentController = {
                        onCloseDialog : function () {
                            oDialog.close();
                        }
                    };
                    // create dialog via fragment factory
                    oDialog = sap.ui.xmlfragment(oView.getId(), "sap.ui.demo.wt.view.HelloDialog", oFragmentController);
                    // connect dialog to the root view of this component (models, lifecycle)
                    oView.addDependent(oDialog);
                }
                oDialog.open();
            }
        });
    });
    

    fragment的生命周期随着view的销毁而销毁,我们要将复用的fragment绑定到rootView
    在Component.js中,添加HelloDialog依赖,this.getAggregation("rootControl")获取manifest.json中定义的rootView,将其作为HelloDialog模块的参数传入,this._helloDialog = new HelloDialog(this.getAggregation("rootControl"));添加openHelloDialog事件的实现this._helloDialog.open();调用helloDialog模块的open事件。
    修改onOpenDialog的实现方法this.getOwnerComponent().openHelloDialog();,getOwnerComponent获取当前view的component,即component.js,然后出发open事件。

    相关文章

      网友评论

          本文标题:UI5_Walkthrough_2

          本文链接:https://www.haomeiwen.com/subject/dyokxxtx.html