2015-11-04 104 views
7

我正在尝试修改web_tree_image小部件。我不想在列中显示小图片,而是在悬停或点击时显示更大的图片。为了达到这个目的,我试图通过覆盖start函数来渲染小部件后添加一个回调函数,如the documentation中所解释的。向web.list.Column的子类中创建的DOM元素添加回调

因此,我下面的代码添加到web_tree_image.js

openerp.web_tree_image = function (instance) { 
    instance.web.list.Image = instance.web.list.Column.extend({ 
     // [...] 
     start: function() { 
      console.log("start called"); 
      // [... add callbacks ...] 
     }, 
     // [...] 
    }); 
}; 

然而,start函数没有被调用,所以这是行不通的。

我还没有完全理解代码路径,通常会导致start被调用,但它似乎是web.list.Column不知何故不同。

应该调用start,我做错了什么?或者在创建DOM元素之后还有另一种执行代码的方式?

+0

尝试使用'include'而不是'extend' – ChesuCR

+0

它不适用于'include';另外,[documentation](https://www.odoo.com/documentation/8.0/reference/javascript.html#subclassing-widget)明确指出它应该与'extend'一起工作。 – ValarDohaeris

+0

我不熟悉Odoo,但根据文档,您必须*使用var my_widget = new MyWidget(this)创建实例*并使用'my_widget.appendTo(“。* some-div “);' – Anonymous0day

回答

-1

虽然我仍然不知道为什么start函数不叫,这是一个解决办法:

openerp.web_tree_image = function (instance) { 
    instance.web.list.Image = instance.web.list.Column.extend({ 
     // ... 
     format: function (row_data, options) { 
      // ... 
      window.setTimeout(function() { 
       console.log("DOM ready"); 
       // ... add callbacks ... 
      }, 0); 
      // ... 
     }, 
     // ... 
    }); 
}; 

通过向事件队列超时0,执行可以被推迟,直到相关的DOM元素已按解释here创建。

-1

根据文档:

新类然后可以通过以下方式被使用:

// Create the instance 
var my_widget = new MyWidget(this); 
// Render and insert into DOM 
my_widget.appendTo(".some-div"); 

这两行之后已经执行(和由appendTo返回的任何承诺( )如果需要的话已经解决了),这个小部件已经可以使用了。


注意

的插入方法将启动widget自己,并且将返回开始的()的结果。

如果由于某种原因您不想调用这些方法,您将必须首先调用控件上的render(),然后将其插入到DOM中并启动它。

+0

为什么downvote? – Anonymous0day

+0

在我的问题中描述的情况下,小部件被实例化为在xml中定义的树视图的一部分(并且实际上将调用引擎盖下的“appendTo”函数)。请注意,我没有实例化和看到小部件的问题,问题实际上就是'start'没有被调用。 – ValarDohaeris