2016-07-30 35 views
0

以下是指Odoo v9企業版。Odoo網絡客戶端。無法使用jquery選擇器選擇html元素

任務:當從主菜單 - >時間表打開時間表表單時,請在詳細信息選項卡上發送.click()事件,以便打開詳細信息選項卡。

問題:當我使用選擇器來選擇元素時,我沒有得到任何回報。 (我已經確認我使用的選擇器對於我感興趣的dom元素是正確的)

根據odoo web客戶端的官方文檔,我擴展了web.FormView小部件,並覆蓋它的啓動方法。從看例子來看,在我看來,當調用start方法時,DOM已經被渲染。

當我在start方法內使用console.log(this)時,我可以看到一個對象具有$el變量中的DOM。

我想使用jquery選擇器進行選擇,但我無法獲取我的對象。

我的自定義部件JS:

odoo.define('t9397.form_override', function(require) { 
    "use strict"; 
    var core = require('web.core'); 
    var web_widget = require('web.FormView') 

    var FormWidgetOverride = web_widget.extend({ 

    start : function(record) { 
     console.log('overridden') 
     console.log(this) 
     this.$("a[data-toggle='tab']:contains('Details')").click() 
     $("a[data-toggle='tab']:contains('Details')").click()// trying both 
     return this._super() 

     } 
    }) 
    core.view_registry.add('form', FormWidgetOverride); 
}); 

DOM對象我想要一個click事件發送至:

< a data-toggle="tab" disable_anchor="true" role="tab" href="#notebook_page_22">Details</a> 

我承諾的知識,Jquery,特別的odoo的Web客戶端有點相當有限。任何幫助都感激不盡。

回答

1

start()可能會執行渲染任務,包括異步過程,所以有必要等待執行完成。按照documentation

窗口小部件是不能保證正常工作,直到 已完成執行其start()方法。在與之交互之前,小部件的父/創建者必須等待 小部件完全啓動。

通常情況下,開始應該返回Deferred() jQuery object,如果start()方法本身是實施得當超,比你可以利用它收到的遞延對象等待它的召喚:

第一種情況使用的簡單的代碼爲你:

start : function() { 
    var sup_ready = this._super(); 
    sup_ready.done(function(){ 
     //your code: 
     console.log('overridden'); 
     console.log(this); 
     this.$("a[data-toggle='tab']:contains('Details')").click(); 
     $("a[data-toggle='tab']:contains('Details')").click(); // trying both 
    }); 
    return $.when(sup_ready); 
    } 
}); 

第二種情況下,使用異步程序和更復雜的代碼:

start : function() { 
    var sup_ready = this._super(); 
    var me_ready = $.Deferred(); 
    . . . 
    sup_ready.done(function(){ 
     . . . 
     . . . 
     //finally Resolve or Reject your deferred object: 
     //Resovle: 
     me_ready.resolve(); //use it if all go ok 
     // *OR* Reject (in case something go wong) to indicate failure: 
//  me_ready.reject(); 
    }); 
    . . . 
    return $.when(sup_ready, me_ready); 
}); 

請注意,我把裏面me_ready.resolve()sup_ready.done()它不是絕對必要的,在總體上可能是周圍即你可以拒絕或解決me_ready超出這個sup_ready.done()的其他方式,就可以解決或者在你的代碼的任何地方拒絕me_ready延遲對象。

 

第二種情況上面並不適用於當前的問題,但它是一個陷阱,以避免在未來,以防萬一。

 

作爲替代您選擇的start()方式,還要考慮部件的events property和檢查,如果你可以把它應用到你的情況...