2016-11-08 47 views
0

我有一個按鈕:sapui5 sap.m.popover不會打開我的控制

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個快速按鈕點擊一次,我的控制就會出現一次。

有什麼建議嗎? 謝謝!

+0

也許this._oPopover有一個值。你可以在if(!this_oPopover)fork中控制日誌記錄嗎? –

回答

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) 
}); 

0

難道說「這」指的不是你所期望的,因爲你的對象是一個匿名函數中創建的?請參閱this解釋(ahem)

我認爲首選模式是讓按鈕在主視圖中調用一個函數,其中'this'指向視圖範圍。

我有一個工作示例如下:然後主視圖我有一個按鈕...

<Button 
    press="showDialogue" 
/> 

和視圖控制器的代碼...

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

注意使用view.addDependent()它讓對話片段訪問視圖模型,並銷燬主視圖生命週期事件(根據文檔)中的對話實例。

或者......你可以創建一個局部變量來捕捉「這」你真的想指...

var contextThis = this; 

只是你行之前開始

var oButton = ... 

然後改變如果您不能更改模式,請參考anon函數內的thiscontextThis

+0

等待flamers評論提出了聖盃這個主題的討論... –