2016-07-30 90 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和检查,如果你可以把它应用到你的情况...