我正在使用ExtJS 4和MVC。我有两个班级,ClassA
和ClassB
。从ClassB
我需要访问ClassA
及其属性。
我使用Ext.require
来ClassA
加载ClassB
,但我不知道我是否正确以及如何使用它。
提前感谢有人可以帮助我的任何帮助
ClassA的
Ext.define('App.view.ClassA', {
extend: 'Ext.panel.Panel',
layout: 'fit',
alias: 'widget.mappanel',
html: "<div id='test-map'></div>",
listeners: {
afterrender: function () {
var osm_source = new ol.source.OSM({
url: 'http://{a-c}.tile.openstreetmap.org/{z}/{x}/{y}.png'
});
var osmLayer = new ol.layer.Tile({
source: osm_source
});
window.app = {};
var app = window.app;
app.Drag = function () {
ol.interaction.Pointer.call(this, {
handleDownEvent: app.Drag.prototype.handleDownEvent
});
this.coordinate_ = null;
this.cursor_ = 'pointer';
this.feature_ = null;
this.previousCursor_ = undefined;
};
ol.inherits(app.Drag, ol.interaction.Pointer);
app.Drag.prototype.handleDownEvent = function (evt) {
var map = evt.map;
var feature = map.forEachFeatureAtPixel(evt.pixel,
function (feature, layer) {
return feature;
});
if (feature) {
this.coordinate_ = evt.coordinate;
this.feature_ = feature;
}
console.log("handleDownEvent" + evt.coordinate);
return !!feature;
};
this.map = new ol.Map({
target: 'test-map',
renderer: 'canvas',
interactions: ol.interaction.defaults().extend([new app.Drag()]),
layers: [osmLayer,
new ol.layer.Vector({
source: new ol.source.Vector({
features: [new ol.Feature(new ol.geom.Point([0, 0]))]
}),
style: new ol.style.Style({
image: new ol.style.Icon( ({
anchor: [0.5, 46],
anchorXUnits: 'fraction',
anchorYUnits: 'pixels',
opacity: 0.95,
src: 'resources/images/location_marker.png'
})),
stroke: new ol.style.Stroke({
width: 3,
color: [255, 0, 0, 1]
}),
fill: new ol.style.Fill({
color: [0, 0, 255, 0.6]
})
})
})
],
view: new ol.View({
center:ol.proj.transform([-74.085491, 4.676015], 'EPSG:4326', 'EPSG:3857'),
zoom: 6
})
});
},
}
});
ClassB的
Ext.require([
'App.view.ClassB'
]);
Ext.define('App.view.menu.ClassA', {
extend: 'Ext.form.Panel',
alias: 'widget.classA',
width: 400,
bodyPadding: 10,
frame: true,
renderTo: Ext.getBody(),
items: [
{
xtype: 'panel',
layout: 'column',
frame: false,
border: false,
items: [
{
html: '<b><i>Click on map</i></b><b>',
frame: false,
border: false
},
{
xtype: 'image',
id: 'locatedDepotByClick',
src: 'resources/images/locate_point.png',
height: 26,
width: 26,
mode: 'image',
listeners: {el: {click: function () {
// I want to use ClassB here
setDepotFromMapMode();
}
}
},
margin: "0 10 2 2"
}]
}]
});
var clickMapActive = false;
function setDepotFromMapMode() {
if (clickMapActive) {
clickMapActive = false;
Ext.getCmp('locatedDepotByClick').setSrc('resources/images/locate_point_active.png');
} else {
clickMapActive = true;
Ext.getCmp('locatedDepotByClick').setSrc('resources/images/locate_point_deactive.png');
}
}
答案 0 :(得分:1)
您可以在初始化时在classB中的requires
配置上附加classA。
因此,当你在classB中做任何事情时,classA已经存在。
// dont use require here, because require is async
Ext.define('App.view.ClassB', {
...
requires: [
// requires goes here
'App.view.ClassA'
],
...
someMethod: function(){
var a = Ext.create('App.view.ClassA');
a.invokeSomeMethod();
//or if you have static method
App.view.ClassA.anotherMethod()
}
...
答案 1 :(得分:0)
您可以使用Ext。
提供的Create实例化ClassBfor
答案 2 :(得分:0)
方法1:您的B类可以扩展A类,以便在B类实例中拥有A类的所有方法。
方法2:您可以将A类中的方法定义为静态,以便从外部访问方法,而无需创建任何A类实例。
方法3:您可以编写包含方法的mixin,并在A类和B类中使用它。