2015-11-04 21 views
7

Tôi đang cố sửa đổi tiện ích web_tree_image. Thay vì chỉ hiển thị một hình ảnh nhỏ trong cột, tôi muốn một hình ảnh lớn hơn xuất hiện khi lơ lửng hoặc nhấp chuột. Để đạt được điều này, tôi đang cố gắng thêm một cuộc gọi lại sau khi tiện ích được hiển thị, bằng cách ghi đè hàm start, như được giải thích trong the documentation.Thêm gọi lại vào phần tử DOM được tạo trong lớp con của web.list.Column

do đó tôi đã thêm đoạn mã sau vào 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 ...] 
     }, 
     // [...] 
    }); 
}; 

Tuy nhiên, start chức năng không bao giờ được gọi là, vì vậy đây không hoạt động.

Tôi chưa hiểu đầy đủ về đường dẫn mã thường dẫn đến số start được gọi, nhưng có vẻ như nó khác bằng cách nào đó cho web.list.Column.

Nên start được gọi và tôi đang làm điều gì sai? Hoặc có cách nào khác để thực thi mã sau khi các phần tử DOM đã được tạo không?

+0

Hãy thử với 'include' thay vì' extend' – ChesuCR

+0

Nó cũng không hoạt động với 'include'; Ngoài ra, [tài liệu] (https://www.odoo.com/documentation/8.0/reference/javascript.html#subclassing-widget) nêu rõ rằng nó sẽ hoạt động với 'extend'. – ValarDohaeris

+0

Tôi không quen thuộc với Odoo nhưng theo tài liệu bạn phải * Tạo cá thể * với 'var my_widget = new MyWidget (this);' và * Render và chèn vào DOM * với 'my_widget.appendTo (". Some-div ");' – Anonymous0day

Trả lời

-1

Trong khi tôi vẫn không biết lý do tại sao chức năng start không được gọi, đây là một cách giải quyết:

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); 
      // ... 
     }, 
     // ... 
    }); 
}; 

Bằng cách thêm vào hàng đợi sự kiện với thời gian chờ 0, thực hiện có thể được hoãn lại cho đến các yếu tố DOM liên quan đã được tạo như được giải thích here.

-1

tài liệu Theo:

Các lớp mới sau đó có thể được sử dụng trong các cách sau đây:

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

Sau hai dòng này đã thực hiện (và bất kỳ lời hứa trả về bởi appendTo () đã được giải quyết nếu cần), tiện ích đã sẵn sàng để sử dụng.


Note

các phương pháp chèn sẽ bắt đầu widget bản thân, và sẽ trả lại kết quả của start().

Nếu vì một lý do nào đó bạn không muốn gọi những phương thức này, bạn sẽ phải> đầu tiên gọi render() trên tiện ích, sau đó chèn nó vào DOM của bạn và khởi động nó.

+0

Tại sao lại là downvote? – Anonymous0day

+0

Trong trường hợp được mô tả trong câu hỏi của tôi, tiện ích được khởi tạo như một phần của chế độ xem dạng cây được xác định trong xml (và thực sự sẽ gọi hàm 'appendTo' bên dưới mui xe).Lưu ý rằng tôi không gặp vấn đề gì khi thấy và thấy widget, vấn đề thực sự chỉ là 'start' không được gọi. – ValarDohaeris

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