Производство Sencha Touch строит перерывы в функционале Ext.Map
У меня проблемы с ST2.3. Я обновился с 2.1 и у меня было несколько регрессий, которые теперь работают нормально. Однако одна проблема, которая определенно кажется неработоспособной, - это обертка Map вокруг API Google. Мое приложение отлично работает в режимах тестирования и разработки, но как только оно будет готово к работе, карта перестает работать.
Код, в котором кажется, что он работает, находится внутри кода Map в функции setMapCenter.
setMapCenter:function(e){var b=this,d=b.getMap(),a=b.getMapOptions(),c=(window.google||{}).maps;if(c){if(!e){if(d&&d.getCenter){e=d.getCenter()}else{if(a.hasOwnProperty("center")){e=a.center}else{e=new c.LatLng(37.381592,-122.135672)}}}
Кажется, точка останова находится на линии: new c.LatLng(37.381592,-122.135672)
,
Почему это внезапно начало сбой на производственной сборке?
Обновление Это трассировка стека, но я не могу выяснить, в чем на самом деле проблема, так как код запутан / уменьшен:
Uncaught TypeError: undefined is not a function VM1471:1
Ext.define.setMapCenterVM1471:1
Ext.define.updateUseCurrentLocationVM1471:1
jVM1471:1
b.implement.initConfigVM1471:1
так далее...
Странно то, что это работало с использованием ST2.1. Он также работает в ST2.3, но только в режиме тестирования / отладки. Мой код даже не устанавливает центр карты при первоначальном отображении вида:
Это вид карты:
Ext.define('MyApp.view.offices.OfficeMap', {
extend: 'Ext.Panel',
alias: 'widget.officemapview',
requires: [
'Ext.Map'
],
config: {
layout: 'fit',
items: [
{
xtype: 'map',
listeners: {
activate: function(me, newActiveItem, oldActiveItem, eOpts){
console.log("activate fired");
},
maprender: function () {
console.log("maprender fired");
var gMap = this.getMap();
this.fireEvent('googleMapRender', gMap);
}
}
}
],
officeRecord: null
}
});
Это код контроллера, который получает событие рендеринга из представления:
onGoogleMapRender: function (googleMap) {
var record = this.selectedOffice;
var longi = record.get("Longitude");
var lati = record.get("Latitude");
console.log("About to create google maps pos")
console.log("About to create google maps marker")
var marker = new google.maps.Marker({
position: new google.maps.LatLng(lati, longi)
});
console.log("About to set maps map object")
marker.setMap(googleMap);
setTimeout(function () {
console.log("map setTimeout")
// weird timeout issue? - http://stackru.com/questions/15041697/sencha-touch-google-map-and-centering-a-marker
googleMap.setZoom(17);
googleMap.panTo(pos);
}, 500);
Ошибка в следующих браузерах:
Chrome - Uncaught TypeError: undefined не является функцией
IE - объект не поддерживает эту функцию
Есть идеи относительно того, что здесь происходит?
2 ответа
Это потому, что ваш javascript загружается до загрузки javascript google maps. Поэтому, когда setMapCenter получит функцию, еще не существует c (не определено). То, что вы можете сделать, это использовать какой-нибудь обратный вызов, например "нарисованный", а затем установить свой "setMapCenter".
Обновить
Попробуйте сделать это только для проверки:
xtype: "map",
listeners: {
activate: function(me, newActiveItem, oldActiveItem, eOpts){
me.config.mapOptions = {
center : new google.maps.LatLng(-42,-42), // your center
zoom : 14,
//others options
}
},
maprender: function(comp, map) {
var me = this;
var map = this.getMap();
// marker test
var position = new google.maps.LatLng(-42, -42);
var marker = new google.maps.Marker({
position: position,
title : 'Hello World',
map: map
});
}
}
Может быть, проверьте в Chrome в инструментах разработчика на вкладке сети, в чем разница в загрузке файлов JavaScript между рабочим режимом и режимом разработки.