UWAGA Przy uruchamianiu tego obiektu cezu w normalnym projekcie, to nie ma żadnych właściwości, które są poprzedzone podkreślenia (_dataSourceCollection, _dataSourceDisplay, etc). Jednak w przypadku wystąpienia w Drupal, około 40-45 właściwości są ustawiane na obiekcie (wszystkie poprzedzone podkreśleniami) oprócz zwykłych właściwości. Dzieje się tak w Drupalu 7 lub 8, i chociaż nie jestem pewien, czy jest to istotne dla problemu, który mam, to zauważalna rozbieżność i dlatego pomyślałem, że powinien być udostępniony.cezu w Drupal: Załaduj Viewer na stronie w Drupal
dodałem bibliotekę cezu z projektu Drupal poprzez umieszczenie pliku w sites/all/libraries/cez/Cesium.js wraz z aktywami i foldery Widżety i wtedy też dzwoniąc hook_library_info w module niestandardowego
function cesium_library_info() {
$libraries['cesium'] = array(
'files' => array(
'js' => 'Cesium.js',
),
'path' => 'js',
'library path' => libraries_get_path('cesium'),
'version' => '1'
);
return $libraries;
}
jestem następnie używając hook_menu powrócić następujące strony callback:
function cesium_page() {
drupal_add_js(libraries_get_path('cesium') . '/Cesium.js');
drupal_add_js(drupal_get_path('module', 'cesium') . '/js/mCesium.js');
drupal_add_css(libraries_get_path('cesium') . '/Widgets/widgets.css');
$page = array();
$page['ces-container'] = array(
'#prefix' => '<div id="myApp-cesium">',
'#suffix' => '</div>',
'#markup' => '<h1>Welcome to Cesium!',
);
return $page;
}
mCesium.js zawiera kod gdzie cez jest wywoływana z poziomu Drupal.behaviors dołączyć Viewer do mojego # myApp-cezu elementu.
Drupal.behaviors.cesium = {
attach: function (context, settings) {
var viewer = new Cesium.Viewer('myApp-cesium', {
imageryProvider : new Cesium.createOpenStreetMapImageryProvider({
url : 'http://thebestmaptiles.map.tile.com/',
}),
baseLayerPicker : false
});
}
}
Powoduje to utworzenie przeglądarki na odpowiednim elemencie wewnątrz głównego kontenera strony Drupal. Widz jest całkowicie pozbawiony treści, jednak i następujący błąd znajduje się w konsoli:
Cesium.js:169769 Uncaught TypeError: this._dataSourceAdded is not a function
Wartość „to” nie jest null lub undefined, ale wydaje się być struktura sugeruje niekompletnie uformowany Viewer obiekt. W tym obiekcie brakuje wszystkich właściwości, które poprzedzone będą podkreśleniami, takimi jak _dataSourceAdded.
Czy ktoś ma wgląd w to, dlaczego tak się dzieje?
Wreszcie, tuż przed opublikowaniem tego, zobaczyłem, że istnieje moduł Drupala dla Cezu, który ma coś ciekawego dzieje się w hook_libraries_info_alter, gdzie baza kodów cezowych jest zapisywana jako publiczna: //cesium_base_url.js.
patrz wiersze 50-59 w cesium.module znaleźć na https://www.drupal.org/project/cesium
47 function cesium_libraries_info_alter(&$libraries) {
48 $library = libraries_detect('cesium');
49
50 if ($library['installed'] == TRUE) {
51 $data = "var CESIUM_BASE_URL = '" . url($library['library path'] . '/Build/Cesium/') . "';";
52 $jsfile = file_unmanaged_save_data($data, 'public://cesium_base_url.js', FILE_EXISTS_REPLACE);
53
54 $libraries['cesium']['files']['js'][$jsfile] = array(
55 'data' => $jsfile,
56 'weight' => 0,
57 'group' => JS_LIBRARY,
58 );
59 }
60 }
jestem pewien, czy to podejście jest związane w ogóle, ale myślałem, że to warto wspomnieć o off szansa, że jest. W każdym razie powinienem również wspomnieć, że wypróbowałem nowy projekt, aby sprawdzić, czy moduł ten będzie działał, ale uważam, że kod do pobrania biblioteki musi zostać zaktualizowany.
EDIT
Chciałbym również wspomnieć, że mam replikowane taką samą sytuację, z tym samym błędem, zarówno Drupal Drupal 7 i 8.
Oto kod, jak załadowany bez Drupal.behaviors, który ponownie tworzy taką samą sytuację z incompetely załadowanego obiektu Cesium.Viewer:
setTimeout(function() {
var viewer = new Cesium.Viewer('myApp-cesium', {
imageryProvider : new Cesium.createOpenStreetMapImageryProvider({
url : 'http://thebestmaptiles.map.tile.com/',
}),
baseLayerPicker : false
});
}, 5000);
Kolejna aktualizacja:
Umieszczenie javasc ript wewnątrz opakowania jQuery nie przynosi żadnych korzyści.
Próbowałem również sprawdzić, czy dodanie bibliotek w funkcji hook_init() mogłoby pomóc, ale tak nie jest.
Kolejna aktualizacja:
Wybitne Rozbieżności - Przeglądarka obiektu w HelloWorld App vs Drupal
Zmienne środowiskowe dla obserwacji:
przesyłam "to" do console.log wewnątrz funkcji Viewer cezu .js, PO wszystkich ustawieniach właściwości prywatnych (właściwości z prefiksem _wartości) i tuż przed wywołaniem funkcji _dataSourceAdded w obiekcie Viewer (linia 169769 w zmodyfikowanym, nieminiaturyzowanym Cesium.js)
console.log(this);
var dataSourceLength = dataSourceCollection.length;
for (var i = 0; i < dataSourceLength; i++) {
this._dataSourceAdded(dataSourceCollection, dataSourceCollection.get
(i));
Oto najważniejsze różnice:
helloworld aplikacji - 41 właściwości (według console.log (Object.keys (tym) .length);)
uznawany za „Viewer "obiekt
zapętlenie nad "kluczem w obj" znaleziono 61 właściwości
53 z nich były prywatne
Drupal aplikacji - 41 właściwości (Object.keys (tym) .length))
uznana jako "obiekt" obiekt
pętli na "kluczem", użyte obj 61 właściwości
0 z nich były prywatne
Jeden fragment powyższego kodu mówi 'var viewer = Cesium.Przeglądarka ... '. Tutaj brakuje słowa kluczowego "new". 'var viewer = new Cesium.Viewer ...' – emackey
Masz rację! Dodanie "nowego" znacznie zmniejsza liczbę właściwości obiektu, mimo że wciąż nie ładuje źródeł danych i wciąż nie ma żadnych prywatnych właściwości. Niedługo zaktualizuję moje pytanie. Dzięki jeszcze raz! –
Tak, naprawiłem to! Proszę napisać coś jako odpowiedź, więc mogę dać ci te punkty za bounty. Co za głupia rzecz, której brakowało ... tak się cieszę, że ją złapałeś. –