sapui5 sap.m.popover不会打开我的控件

时间:2016-11-08 15:59:32

标签: javascript jquery sap sapui5

我有一个按钮:

var oButton = new sap.m.Button({
                    text: "Press me",
                    press: function (oEvent) {
                        if (! this._oPopover) {
                            this._oPopover = sap.ui.xmlfragment("sap.my.library.Popover", this);
                            this._oPopover.setModel(true);
                        }
                        var oButton = oEvent.getSource();
                        var oMyControl= this._oPopover.getAggregation('content')[0];
                        oMyControl.setPlaceholder("Hello World");
                        jQuery.sap.delayedCall(0, this, function () {
                            this._oPopover.openBy(oButton);
                        });
                    }
                })

我有我的xml片段:

<core:FragmentDefinition
    xmlns="sap.m"
    xmlns:core="sap.ui.core"
    xmlns:d="sap.my.library">
    <Popover>
        <d:myControl value=""/>
        <!--<Input></Input>-->
    </Popover>
</core:FragmentDefinition>

现在,当我点击按钮时,没有任何反应,只有当我多次点击它时,我的控件才出现。 我可以说,每按10次快速按钮,我的控件可能会出现一次。

有什么建议吗? 谢谢!

2 个答案:

答案 0 :(得分:2)

this._oPopover是在按钮声明中声明的匿名函数中定义的。

它不能像您预期的那样引用视图字段。

我的建议:

var onButtonPress = function (oEvent) {
     if (! this._oPopover) {
         this._oPopover = sap.ui.xmlfragment("sap.my.library.Popover", this);
         this._oPopover.setModel(true);
     }
     var oButton = oEvent.getSource();
     var oMyControl= this._oPopover.getAggregation('content')[0];
     oMyControl.setPlaceholder("Hello World");
     jQuery.sap.delayedCall(0, this, function () {
         this._oPopover.openBy(oButton);
     });
}

var oButton = new sap.m.Button({
    text: "Press me",
    press: this.onButtonPressed.bind(this)
});

[代码未经测试!]

答案 1 :(得分:0)

是不是因为你的对象是在匿名函数中创建的,所以'this'不是指你期望的?见this解释(哼)

我认为首选模式是按下按钮调用主视图中的一个函数,其中'this'指的是视图范围。

我有一个如下工作示例:在主视图中我有一个按钮......

buildToolsVersion "23.0.3"

和视图控制器的代码......

<Button
    press="showDialogue"
/>

请注意使用 view.addDependent(),它允许对话片段访问视图模型并在主视图生命周期事件中根据文档销毁对话实例。

或者......你可以创建一个局部变量来捕捉你实际想要引用的'this'......

    showDialogue: function(){
        if(!this._oConfirmDialog){
            this._oConfirmDialog = sap.ui.xmlfragment("sapui5.muSample.view.ConfirmDialog", this);
            this.getView().addDependent(this._oConfirmDialog);
        }
        this._oConfirmDialog.open();
    },

在你的行开始之前

var contextThis = this;

如果无法更改模式,则将anon函数内的var oButton = ... 引用更改为this