2012-01-11 34 views
5

Tôi đang tìm cách để ghi đè lên một số chức năng cốt lõi của jenerp web js như "on_logout".openerp web client 6.1: cách ghi đè lên các hàm javascript cơ sở

Các tài liệu thiếu hướng dẫn (như bạn có thể thấy trong my post) và helloworld module nói với bạn rằng bạn có thể làm điều đó như

openerp.web_hello = function(openerp) { 

openerp.web.SearchView = openerp.web.SearchView.extend({ 
    init:function() { 
     this._super.apply(this,arguments); 
     this.on_search.add(function(){console.log('hello');}); 
    } 
}); 

// here you may tweak globals object, if any, and play with on_* or do_* callbacks on them 

openerp.web.Login = openerp.web.Login.extend({ 
    start: function() { 
     console.log('Hello there'); 
     this._super.apply(this,arguments); 
    } 
}); 

}; 

Trong mô-đun của tôi, tôi đang làm điều này:

openerp.mytest = function(openerp){ 

    openerp.web.WebClient = openerp.web.WebClient.extend({ 
     on_logout: function() { 
      alert('mine'); 
      [...] 
     }, 
    }); 
} 

Tôi biết js được tải kể từ khi đặt cảnh báo bên ngoài định nghĩa này hoạt động.

Có gì sai ở đây?

Trả lời

4

Đó là một vấn đề đặc biệt vì bạn muốn thay đổi nguyên mẫu (lớp, nếu bạn muốn) của đối tượng đã được khởi tạo (một cá thể WebClient là gốc của hệ thống) tại thời điểm mã của bạn được nạp, do đó việc tạo một "lớp" WebClient mới sẽ không làm thay đổi cá thể hiện tại).

Trong trường hợp đó, bạn không thể thay thế lớp bằng lớp con, bạn phải mở lại lớp (theo cách tương tự như Ruby), để có phương thức include đối tượng lớp, trong đó nên công việc:

openerp.mytest = function(openerp) { 
    openerp.web.WebClient.include({ 
     on_logout: function() { 
      alert('mine'); 
      this._super.apply(this, arguments); 
     } 
    }); 
} 

(như trong Ruby, this._super được ràng buộc với phương pháp bạn đang thay thế, nếu có, cho thay đổi lớp tại chỗ)

Nếu bạn kiểm tra các tập tin thực hiện view_list_editable.js, nó cung cấp các ví dụ về điều đó vì nó cần phải mở lại và thay đổi mã của listview i n để thêm khả năng chỉnh sửa.

+1

Xin chào, cảm ơn bạn đã trả lời. Tôi chỉ thử điều này nhưng không hoạt động. Nó tiếp tục sử dụng bản gốc. FWIW Tôi vừa mới phát hành bản phát hành mới nhất. – simahawk

+1

Ồ, tôi quên rằng đây là một phương thức "callback" ('on_ *' và 'do_ *' được liên kết trực tiếp với các cá thể trong 'init' nếu lớp mở rộng' openerp.web.CallbackEnabled' bằng cách nào đó), và 'WebClient' được instanced trước khi bất kỳ module nào được tải. Giải pháp duy nhất của bạn là sử dụng javascript thô và truy cập 'openerp.webclient' (cá thể webclient cho phiên này, nếu có) và thay đổi trực tiếp. Một cái gì đó như 'openerp.webclient.on_logout.add_first (function() {console.log ('logout của tôi')});' works. Thay thế on_logout có thể sẽ không hoạt động vì các sự kiện bị ràng buộc háo hức (một ý tưởng tồi). – xmo

+0

tôi đã cố gắng: openerp.mytest = function (OpenERP) { openerp.webclient.on_logout.add_first ('! Thatsme' function() { alert();} ); } nhưng nó có vẻ vô dụng là tốt: ( – simahawk

Các vấn đề liên quan