2016-09-10 44 views
15

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

+0

Jeden fragment powyższego kodu mówi 'var viewer = Cesium.Przeglądarka ... '. Tutaj brakuje słowa kluczowego "new". 'var viewer = new Cesium.Viewer ...' – emackey

+0

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! –

+0

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ś. –

Odpowiedz

4

Powyższy kod pierwotnie miał tę linię, aby utworzyć widza:

var viewer = Cesium.Viewer('myApp-cesium', 

Został brakuje new kluczowe:

var viewer = new Cesium.Viewer('myApp-cesium', 

jest potrzebna new kluczowe aby prawidłowo skonstruować nową instancję Przeglądarka cezu. Szczegółowe informacje na temat tego, co dokładnie robi new, patrz this answer on Stack Overflow.

3

Pewne postępy w tym zakresie. Okazuje się, że każdy z katalogów Assets/Widgets/Workers musiał znajdować się w bibliotekach/cezie/Build/Cesium/

Teraz globus pojawia się normalnie i wydaje się działać (należy sprawdzić, czy istnieją ograniczenia). Funkcja "this._dataSourceAdded nie jest funkcją" nadal pozostaje, chociaż wydaje się, że nie powoduje żadnych problemów na tyle, na ile mogę to jeszcze stwierdzić.

Zaktualizuję po kolejnych testach.

+0

Aktualizacja: Cała funkcjonalność wydaje się być normalna, dopóki nie spróbuję załadować źródła danych. Dane w źródle danych wyglądają dobrze, ale żadne funkcje nie są budowane na mapie. –

+0

Jedyne inne odniesienie, które widziałem w tym błędzie: https://groups.google.com/forum/#!msg/cesium-dev/MAVRdeFWYjk/s31zbc9tAQAJ –

+0

Aktualizacja: próbowałem uruchomić kod bez Drupal.behaviors. Zamiast tego po prostu umieściłem go wewnątrz funkcji setTimeout, ale nadal powoduje to ten sam komunikat o błędzie. Przynajmniej możemy założyć, że Drupal.behaviors nie ma nic wspólnego z problemem. –