SAPUI5 (03) - 简单控件的使用

对于熟悉微软技术的人来说,OpenUI5 的控件比较容易理解,控件在页面上有不同的外观,实现了属性 ( properties )、方法 ( methods ) 和事件 ( events ) 。我们先来实现一个简单的功能,在页面上放置一个 sap.m.Button,当用户点击它的时候,弹出一个对话框,显示 “Hello” 字符串。

sap.m.Button 简介

  • namesapce: sap.m
  • Constructor: new sap.m.Button(sId?, mSettings?);
  • setText(sText): 设置按钮的文本
  • attachPress(fnFunction): 添加 Button 的事件处理程序 ( event handler),当用户点击按钮时触发。

动手实践

在 Eclipse 中新建类型为 SAPUI5 Application Project 的项目,Project name 为 zsapui5_button。不勾选 initial view。新建完成后,编写
application area 的代码如下:

<script>
    var onButtonPressed = function() {
        alert("Hello!");
    };
    
    function initialization() {
        var oButton = new sap.m.Button();
        oButton.setText("Click me.");
        oButton.attachPress(onButtonPressed);
        
        oButton.placeAt("content");
    };
    
    sap.ui.getCore().attachInit(initialization);
    
</script>

Java 风格代码 vs JSON风格代码

以上创建一个 sap.m.Button 对象的实例 oButton,用 setText() 方法设置文本,用 attachPress() 添加时间处理程序。这种写法被称为 Java
风格的代码,还有一种 Json 风格的代码在 JavaScript 用的更加普遍。
Json 风格的代码能少代码量,但代码结构比较复杂的时候,易读性也是一个问题。以下是同样的功能 Json 风格代码的实现:

<script>
    var onButtonPressed = function() {
        alert("Hello!");
    };
    
    function initialization() {
        var oButton = new sap.m.Button({
            text: "Click me.",
            press: onButtonPressed
        });             
        
        oButton.placeAt("content");
    };
    
    sap.ui.getCore().attachInit(initialization);
    
</script>

事件处理器 (Event handler)

onButtonPressed 函数是一个 event handler,当用户点击按钮的时候,弹出一个对话框。但这个对话框中显示的字符串 Hello 是硬编码的。我们接下来把代码做两个改变,第一个改变,当用户点击的时候,显示按钮的text(也就是字符串Click me.)

我们知道,sap.m.Button.getText() 方法可以获得按钮的文本,但因为
oButton 是在函数 initialization 中,所以 onButtonPressed() 函数不能访问。所以,我们需要在 onButtonPressed 增加一个参数:

<script>
    var onButtonPressed = function(oEvent) {
        oText = oEvent.getSource().getText();
        alert(oText);
    };
    
    function initialization() {
        var oButton = new sap.m.Button({
            text: "Click me.",
            press: onButtonPressed
        });             
        
        oButton.placeAt("content");
    };
    
    sap.ui.getCore().attachInit(initialization);
    
</script>

oEvent 参数是一个 event 对象,包含很多事件的的信息。比如,我们可以用oEvent.getSource() 得到是哪一个控件触发的事件。

第二个要做的改变就是通过 getSource() 方法,让多个控件共用 event handler。我们再页面上创建两个 Button,共用一个 event handler,当用户点击的时候,显示不同的的文本:

<script>
    var onButtonPressed = function(oEvent) {
        var sId = oEvent.getSource().getId();
        
        if (sId == "btn1") {
            alert("Hello from Button1");
        }
        if (sId == "btn2") {
            alert("Hello from Button2");
        }
    };
    
    function initialization() {
        var oButton1 = new sap.m.Button("btn1", {
            text: "Button 1",
            press: onButtonPressed
        }); 
        
        var oButton2 = new sap.m.Button("btn2", {
            text: "Button 2",
            press: onButtonPressed
        });
        
        oButton1.placeAt("content");
        oButton2.placeAt("content");
    };
    
    sap.ui.getCore().attachInit(initialization);
    
</script>

控件的 Aggregation 和 Association

简单控件独立存在,但界面上控件有时还要以某种关系存在。第一种关系是 包含关系 。比如容器控件中包含其他控件,又比如
radioButtonGroup 包含若干个 radioButton 。这种关系中的控件分别称为父控件 ( parent control ) 和子控件 ( child control ) 。父控件对其它控件的参照称为聚合 ( aggregation )

Aggregation 关系中,各个子控件的生命周期依赖于父控件,当父控件销毁的时候,子控件也被销毁。另外,子控件不使用 placeAt() 方法放在
DOM 对象中,而是利用父控件的方法添加到父控件的集合中,由父控件来渲染。下面使用 radioButtonGroupradioButton 说明聚合关系:

<script>
    function initialization() {
        
        var oLabel = new sap.m.Label({text: "Do you like basketball?"});
        
        var oRadioBtn1 = new sap.m.RadioButton({text: "Yes"});
        var oRadioBtn2 = new sap.m.RadioButton({text: "No"});
        
        var oRadioBtnGrp = new sap.m.RadioButtonGroup({columns: 2});
        oRadioBtnGrp.addButton(oRadioBtn1);
        oRadioBtnGrp.addButton(oRadioBtn2);
        
        oLabel.placeAt("content");
        oRadioBtnGrp.placeAt("content");
    };
    
    sap.ui.getCore().attachInit(initialization);
    
</script>

radioButtonGroupaddButton() 方法,将 radioButton 添加到radioButtonGroup 中。运行的界面如下:

第二种关系叫做 association,指一个控件参照到另外一个控件。我们刚才的例子中,labelradioButtonGroup 是完全独立的,而按照 web设计的 ARIA 兼容原则 ( ARIA: Accessible Rich Internet Applications ),这两个控件应该关联起来。通过查看 radioButtonGroup 的 API,可以设置 ariaLabelledBy 属性:

代码如下:

<script>
    function initialization() {
        
        var oLabel = new sap.m.Label({text: "Do you like basketball?"});
        
        var oRadioBtn1 = new sap.m.RadioButton({text: "Yes"});
        var oRadioBtn2 = new sap.m.RadioButton({text: "No"});
        
        var oRadioBtnGrp = new sap.m.RadioButtonGroup({
            columns: 2,
            ariaLabelledBy: oLabel});
        
        oRadioBtnGrp.addButton(oRadioBtn1);
        oRadioBtnGrp.addButton(oRadioBtn2);
        
        oLabel.placeAt("content");
        oRadioBtnGrp.placeAt("content");
    };
    
    sap.ui.getCore().attachInit(initialization);
    
</script>

和 Aggregation 不同的是,Association 中父子控件的生命周期是独立的。

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 199,711评论 5 468
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 83,932评论 2 376
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 146,770评论 0 330
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 53,799评论 1 271
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 62,697评论 5 359
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 48,069评论 1 276
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 37,535评论 3 390
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 36,200评论 0 254
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 40,353评论 1 294
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 35,290评论 2 317
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 37,331评论 1 329
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 33,020评论 3 315
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 38,610评论 3 303
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 29,694评论 0 19
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 30,927评论 1 255
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 42,330评论 2 346
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 41,904评论 2 341

推荐阅读更多精彩内容