2013-07-10 65 views
1

我正在嘗試註冊我的onClick偵聽器到dijit按鈕作爲內嵌窗口小部件被放置爲GridX。我已經做了以下基礎上例如test_grid_cellWidget如何在GridX中註冊onClick監聽器到dijit Button?

{ field: "save", name:"Save", 
    widgetsInCell: true, 
    navigable: true, 
    decorator: function(){ 
     //Generate cell widget template string 
     return '<button data-dojo-type="dijit.form.Button" data-dojo-attach-point="btn">Save</button>' 
    }, 
    setCellValue: function(data){ 
     //"this" is the cell widget 
     this.btn.set("label", "Speichern") 
     this.btn.connect("onClick", function(){ 
      alert('clicked') 
     }) 
    } 
}, 

setCellValue成功執行,標籤被改變。但是,當我點擊按鈕時,onClick監聽器沒有註冊,也沒有被調用。當我使用語法data-dojo-props="onClick:function"它的工作原理,但它需要聲明偵聽器函數爲全局,這是我想避免的。

無論如何,我有Button對象,並且正在執行在dijit文檔中找到的代碼,所以它應該工作。但爲什麼在這種情況下沒有登記?

回答

2

我發現在維基的gridx答案:https://github.com/oria/gridx/wiki/How-to-show-widgets-in-gridx-cells%3F

您需要使用領域cellWidget.btn._cnnt

setCellValue: function(gridData, storeData, cellWidget){ 
     this.btn.set("label", "Speichern") 
     if(cellWidget.btn._cnnt){ 
      // Remove previously connected events to avoid memory leak. 
      cellWidget.btn._cnnt.remove(); 
     } 
     cellWidget.btn._cnnt = dojo.connect(cellWidget.btn, 'onClick', lang.hitch(cellWidget.cell, function(){ 
      rowSaveClick(this.row) 
     })); 
    }, 
1

我不知道你使用的是什麼dojo版本,但是當你使用data-dojo類型時,我想它是1.7+。 首先,我建議刪除模塊名稱的點符號,並開始使用AMD中間語法(即:爲「dijit/form/Button」放置「dijit.form.Button」,因爲點符號將被放入dojo 2.0)。

然後,事件連接到窗口小部件的推薦方法是:

  • 任一定義事件作爲函數(像widget.onClick =函數(EVT){...})
  • 或使用widget的「on」方法(比如widget.on(「click」,function(evt){...}))

我更喜歡使用第二種形式,因爲它與dojo /上。它由使用沒有「on」的事件名稱組成,並將所有內容都放在小寫字母中。例如,如果你的小部件已經擴展點名爲「onMouseRightClick」,你可以使用它作爲widget.on(「mouserightclick」,...)

你的例子則變成:

{ field: "save", name:"Save", 
    widgetsInCell: true, 
    navigable: true, 
    decorator: function(){ 
     //Generate cell widget template string 
     return '<button data-dojo-type="dijit/form/Button" data-dojo-attach-point="btn">Save</button>' 
    }, 
    setCellValue: function(data){ 
     //"this" is the cell widget 
     this.btn.set("label", "Speichern") 
     this.btn.on("click", function(){ 
      alert('clicked') 
     }); 
    } 
}, 

注:未經測試的代碼。我只是猜測問題可能是什麼。讓我知道如果仍然有一個問題...

+0

不,它應該可以工作,但GridX會改變小工具中的某些東西,看到我的答案,我終於找到了答案。 on()是我的第一個猜測。也許它是因爲當網格控件被渲染和銷燬時潛在的內存泄漏而被阻塞(例如,在分頁時) –

+0

我看到...雖然在1.2中似乎有一個更新的方法,但使用getCellWidgetConnects方法,在下面的鏈接中提到你拿的例子。 – Philippe

+0

我無法使getCellWidgetConnects工作:( –

1

我發現使用getCellWidgetConnects效果很好(see docs)。

但是文檔並不完全清楚,所以它一開始並不適合我。如果連接到DomNode,則通過'click'作爲connections數組中的事件。如果您連接到Dijit小部件,則通過'onClick'