2011-02-08 42 views
5

Tôi có một câu hỏi liên quan đến đa kế thừa trong ExtJS. Trong khi tôi biết tôi chỉ đơn giản là có thể lặp lại mã để làm cho nó xảy ra, nhưng tôi muốn biết nếu có bất kỳ cách nào để mã nó hiệu quả hơn.Extjs đa thừa kế?

Tôi có thành phần GridPanel được tùy chỉnh trong khuôn khổ của tôi, được gọi là Kore.ux.grid.GridPanel. Nó mở rộng Ext.GridPanel với các chức năng phổ biến bổ sung và cung cấp giao diện cho các hành động REST.

Chẳng bao lâu sau, đồng nghiệp của tôi muốn có EditorGridPanel cũng được triển khai theo cách tương tự, tức là cô ấy muốn có thể chỉnh sửa và đồng thời có khả năng thực hiện các tác vụ REST dễ dàng.

Câu hỏi của tôi là, có cách nào tôi có thể mở rộng Ext.EditorGridPanel để nhận các chức năng tùy chỉnh Kore.ux.grid.GridPanel không?

Xin lỗi vì bất kỳ lỗi ngữ pháp nào và tôi có thể nói lại nó nếu nó khó hiểu. Cảm ơn!!

EDIT

Tôi googled một lần nữa, và tôi thấy chủ đề nói đó là không thể. Có mô hình mã hóa tốt hơn tôi nên làm theo nếu tôi có vấn đề này?

Cảm ơn!

EDIT LẠI

Vì vậy, xin lỗi tôi thấy cấu trúc phù hợp với tôi .. Dưới đây là phương pháp tôi thấy hữu ích với tôi:

var Common = function(){} //abstract class 
Ext.apply(Common.prototype, { 

    a : function(){}, 
    b: function(){}... 

}); 

Ext.ux.SomePanelA = Ext.extend (Ext.Panel, { 

    stuff : ............ 

}); 

Ext.ux.SomePanelB = Ext.extend (Ext.Panel, { 

    diffStuff : ............ 

}); 

Ext.applyIf(Ext.ux.SomePanelA.prototype, Common.prototype); 
Ext.apply(Ext.ux.SomePanelB.prototype, Common.prototype); 

Mã Nguồn: http://www.sencha.com/forum/showthread.php?48000-multiple-inheritance&p=228271&viewfull=1#post228271

hãy một lần nữa cung cấp gợi ý hữu ích nếu bạn nghĩ rằng bạn có một giải pháp tốt hơn :) Cảm ơn!

Trả lời

5

Điều bạn thực sự cần xem xét, là plugin ExtJS.

/** 
* Boilerplate code taken from 'ExtJS in Action' by Jay Garcia 
*/ 
YourNameSpace.RestGridPlugin = Ext.extend(Object, { 
    constructor : function(config) { 
    config = config || {}; 
    Ext.apply(this.config); 
    }, 

    init : function(parent) { //parent argument here, is whatever you apply your plugin to 
    parent.on('destroy', this.onDestroy, this); 
    Ext.apply(parent, this.parentOverrides); 
    }, 

    onDestroy : function() { 
    //here you need to free any resources created by this plugin 
    }, 

    parentOverrides : { 
    //here you do your magic (add functionality to GridPanel) 
    } 

}); 

Ext.preg('restgridplugin',YourNameSpace.RestGridPlugin); //register your brand ne plugin 

Cách sử dụng

someGrid = { 
    xtype: 'grid', 
    columns: ... 
    store: ... 
    plugins: [ 
    'restgridplugin' 
    ] 
} 

someEditorGrid = { 
    xtype: 'editorgrid', 
    columns: ... 
    store: ... 
    plugins: [ 
    'restgridplugin' 
    ] 
} 
+0

PLUGIN! Tại sao tôi quên sự tồn tại của nó !! Cảm ơn đề xuất :) Sẽ xem tôi sẽ kết hợp nó như thế nào trong khung công tác.Cảm ơn :) –

+0

Nhưng điều này có thể không phù hợp với trường hợp của tôi như tùy chỉnh GridPanel của tôi cung cấp tùy chỉnh pagingToolbar, nút định sẵn, hộp tìm kiếm, REST ... vv Plugin có thể không phải là cách :) Cảm ơn bạn đã đề xuất! –

+0

Tại sao không? Bạn có thể truy cập các thành phần tùy chỉnh này từ bên trong plugin để liên kết chức năng của bạn với chúng. Sau khi tất cả, những gì các plugin nào là trong thực tế 'Ext.apply()' chỉ là cách bạn làm điều đó ngay bây giờ. Nó chỉ thêm một chút mạnh mẽ hơn và dễ sử dụng API cho điều đó. – Mchl

0

Tạo Kore.ux.grid.AbstractGridPanel làm lớp cơ sở có chức năng chung. Và tạo hai lớp con: Kore.ux.grid.GridPanelKore.ux.grid.EditorGridPanel (với chức năng cụ thể).

+0

Vấn đề là, 'Ext.grid.EditorGridPanel' kéo dài 'Ext.grid.GridPanel', REST "Giao diện" tôi đã cung cấp đang mở rộng 'Ext.grid.GridPanel' và bởi vì tôi cần các chức năng được cung cấp trong' Ext.grid.EditorGridPanel', tôi nghĩ cách tốt nhất là viết một lớp cơ sở chung và mở rộng cả hai 'Ext.grid .GridPanel' và 'Ext.grid.EditorGridPanel' với lớp cơ sở chung. Cảm ơn bạn đã nhập liệu :) –

0

Tôi không đồng ý với việc sử dụng Plugins để thực hiện đa kế thừa trong Ext. Plugin được thiết kế để thay đổi hành vi hoặc thêm chức năng mới.

Cách đúng để đạt được đa kế thừa là bằng cách sử dụng mixins, xin vui lòng xem lời giải thích này tuyệt vời SenchaCon 2011: The Sencha Class System

Ext.define('FunctionalityA', { 
    methodA: function() { 
     ... 
    } 
}); 

Ext.define('FunctionalityB', { 
    methodB: function() { 

    } 
}); 

Ext.define('MultipleFunctionality', { 
    mixins: [ 
     'FunctionalityA', 
     'FunctionalityB' 
    ], 

    method: function() { 
     methodA(); 
     methodB(); 
    } 
});