openui5(SAPUI5)組件-項目搭建


openui5這個組件庫對於很多前端來說都是比較陌生的,在之前我甚至都沒有聽說過這個東西。現在公司項目以這組件庫為主,那就必須要加以熟悉。但是在百度上搜到的資料比較少,所以把自己對於這個組件的了解和使用記錄一下。

openui5官網:https://openui5.org/,目前文檔沒有中文版的,因此都是英語。

在官網中點擊Documentation,在下面有個Demos,可以看到有個Demo Apps,這里面有一些官網提供的demo和組件的效果演示,大家可以自己下載然后看下具體的項目目錄結構,從目錄結構可以看到,demo很明顯是mvc模式。現在我們來從零搭建一個openui5的項目。在官網上,點擊Releasea,在最下面有個All Releases,這里面都是關於openui5組件的一些sdk,這里我下載的是runtime,並沒有下載sdk,因為sdk里面不僅包含了openui5的所有組件,還有一些組件的文檔說明,體積比較大。所以我選擇了只有組件的runtime。下載解壓后有個resources文件夾,這個文件夾下面就是oepnui5提供的所有組件了。

之前我們用的vue腳手架或者react腳手架,咱們啟動項目時腳手架會自動起一個webServer本地服務。但是我們新建一個openui5的項目就沒有自動給我們起這種服務,因此我們需要自己搭建這種環境,我自己是用的tomcat搭建的本地服務器來運行項目的,當然了,除此之外還有很多其他方式,比如建一個nodejs項目自己開啟一個webServer,或者使用google瀏覽器的webServer插件等。因為我自己的環境已經搭好了,再加上這些東西百度上資料也比較多,所以這里就不多說了。當我們搭建好之后,建立一個項目,把從官網下載解壓后的resources文件夾拷貝到項目下 ,建立一個index.html文件,然后我們引入openui5到項目中:

 

 1 <!DOCTYPE html>
 2 <html>
 3 <head>
 4     <meta charset="utf-8">
 5     <meta name="viewport" content="width=device-width, initial-scale=1.0">
 6     <title>openui5</title>
 7 
 8     <script 
 9     id="sap-ui-bootstrap" 
10     src="./resources/sap-ui-core.js" 
11     data-sap-ui-theme="sap_belize"
12     data-sap-ui-resourceroots='{
13         "test": "./"
14     }' 
15     data-sap-ui-oninit="module:sap/ui/core/ComponentSupport" 
16     data-sap-ui-compatVersion="edge"
17     data-sap-ui-async="true" 
18     data-sap-ui-frameOptions="trusted">
19     </script>
20     <script>
21         sap.ui.getCore().attachInit(function () {
22             sap.ui.require([
23                 "sap/m/Page",
24                 "sap/ui/core/ComponentContainer"
25             ], function (Page, ComponentContainer) {
26                 new Page({
27                     showHeader: false,
28                     content: new ComponentContainer({
29                         height: '100%',
30                         name: 'test',
31                         settings: {
32                             id: 'test'
33                         }
34                     })
35                 }).placeAt('content');
36             })
37         });
38     </script>
39 
40 </head>
41 
42 <body>
43     <div id='content'></div>
44 </body>
45 
46 </html>

在這段代碼中,除了引入opeui組件外,還對目錄路徑進行了重命名,也就是data-sap-ui-resourceroots,我指定了當前目錄為根路徑,方便以后引入組件使用。sap.ui.getCore().attachInit是在組件加載完成后會自動調用,並執行該函數下的回調函數。如果不在這個函數下面創建組件,而是直接使用組件,會報錯說找不到組件,這時候加個定時器延時三秒執行就能找到了,這說明組件庫是異步加載的,而attachInit是官網提供的方法,從官網demo中也可以找到。在這里我創建一個Page組件,然后在Page中直接創建了ComponentContainer組件,設置了id和高度,然后調用placeAt把組件添加進div中。其實這里的Page組件完全可以省略掉,就創建ComponentContainer也沒問題。

到了這里,項目也一樣跑不起來,這時候我們啟動本地服務打開項目下的index.html會發現控制台有一大堆報錯:

 

 

 很明顯,和官網demo比起來,我們項目顯的有些簡單了,只有一個資源文件夾和html文件,根據錯誤信息看出,我們還差幾個文件,現在我們把提示不存在的那幾個文件在項目中建起來,於是目錄就變成了這樣:

 

 這是時候刷新頁面,仍然報錯:

 

 

 剛才我們建立了一個Component的js文件,這個文件是每次啟動項目肯定會執行的,這個文件是用於繼承openui5的UIComponent組件的,然后在Component文件下,調用父組件的initialize方法去初始化路由。所以Component需要繼承UIComponent,在Component中增加如下代碼:

 1 sap.ui.define([
 2     'sap/ui/core/UIComponent' // 引入openui5的UIComponent組件
 3 ],
 4 function (UIComponent) {
 5     'use strict';
 6     // 繼承組件
 7     return UIComponent.extend('test.Component', {
 8         metadata: {
 9             manifest: 'json'
10         },
11         // 該函數可以在組件初始化時自動調用
12         init: function () {
13             // 將父組件init函數指向子組件本身
14             UIComponent.prototype.init.apply(this, arguments);
15             // 初始化路由
16             this.getRouter().initialize();
17         }
18     });
19 });

加上之后,再次刷新頁面,控制台繼續報錯:

 

 

 

 提示缺少一個manifest.json文件,在上面有提到過路由,而路由的定義,就和這個缺少的文件有關,所以這文件極為重要,里面包含了很多配置信息,官網的demo中,manifest.json有些配置我們搭建簡單項目根本用不上,所以我對它的文件進行了簡化,現在在項目根目錄下創建manifest.json文件:

 1 {
 2     "_version": "1.12.0",
 3 
 4     "sap.ui5": {
 5         "rootView": {
 6             "viewName": "test.home.view.Home",
 7             "type": "XML",
 8             "async": true,
 9             "id": "app"
10         },
11 
12         "routing": {
13             "config": {
14                 "routerClass": "sap.m.routing.Router",
15                 "viewType": "XML",
16                 "viewPath": "test.home.view",
18          "controlAggregation":"pages",
17 "controlId": "app", 18 "async": true 19 }, 20 21 "routes": [ 22 { 23 "pattern": "", 24 "name": "home", 25 "target": "home" 26 } 27 ], 28 29 "targets": { 30 "home": { 31 "viewName": "Home", 32 "viewId": "homeId" 33 } 34 } 35 } 36 } 37 }

在這個配置文件中,我只保留了必須要的配置,

rootView:在該對象下指定項目的入口視圖

config:指定使用組件路由,視圖文件類型,是否異步加載,視圖id。

routes:指定路由路徑,這里設置為空,就相當於根目錄。路由名字和路由對應的目標文件。

targets:這里面指定路由目標文件,我這里指定了name,是因為routes下面的那個target屬性為name,這里需要對應,否則找不到。

在這里面還有個疑惑,在上面的rootView中,viewName屬性我們指定為test.home.view.Home,這里可看成是test/home/view/Home,test就是在index.html文件中自己設置根目錄路徑。項目執行順序會先到rootView里面找到這些配置,這里我們指定了這么一個路徑,那我們就需要在項目中增加一個對應的文件,否則會出問題。建立一個home目錄:

 

 

 因為這個組件是以mvc模式為主,所以建立的文件也是根據mvc模式來的,但我這里只建了vc而沒有m,因為目前只是簡單搭建項目,暫時不需要m,所以我給省略了。在view和controller下分別有Home.view.xml文件和Home.controller.js文件,這兩個文件都不能夠為空,所以我們分別在兩個文件中增加簡單的代碼讓項目運行起來:

Home.controller.js

 1 sap.ui.define([
 2     "sap/ui/core/mvc/Controller", //引入組件的controller控制器
 3 ], function (Controller) {
 4     "use strict";
 5   // 繼承組件的Controller
 6     return Controller.extend("test.home.controller.Home", {
 7      // 初始化函數,自動調用
 8         onInit : function () {
 9             console.log('進入到了Home controller');
10         }
11     });
12 
13 });

 

Home.view.xml

1 <mvc:View
2     controllerName="test.home.controller.Home"
3     xmlns="sap.m"
4     xmlns:mvc="sap.ui.core.mvc">
5     <App id='app'>
6         <Text text='這里是Home頁面的Text標簽'></Text>
7     </App>
8 </mvc:View>

controllerName:指定相關聯的視圖控制器。

App標簽指定的id和manifest.json里面設置的controId需一致。

然后我們再次刷新頁面運行:

 

 

 可以看到這句話是我們在xml中Text標簽的那句話。控制台也沒有任何報錯,到這里一個簡單的openui5項目就算是搭建成功了。前面有提到openui5是以mvc模式為主,因此需要對mvc模式有一定的了解。

這個項目執行順序,項目啟動后進入到根目錄的index.html文件,然后執行根目錄下的Component.js文件,在這個文件中初始化路由,而路由的定義就是在manifest.json下的rootView中指定路徑的,然后會在manifest.json中找到routing,初始化相關配置,在通過routes找到對應的路由頁面進行渲染。執行過程大致如此。


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM