2016-09-10 5 views
15

重要な注意 通常のプロジェクトにおけるセシウムオブジェクトをインスタンス化する場合、それはアンダースコア(_dataSourceCollection、_dataSourceDisplay、など)が付いている任意のプロパティを持っていません。しかし、Drupalでインスタンス化すると、通常のプロパティに加えて、約40〜45個のプロパティがオブジェクトに設定されます(すべてがアンダースコアで始まります)。これはDrupal 7または8で発生しますが、これが私が抱えている問題に関連するかどうかはわかりませんが、それは目立った矛盾であり、共有するべきだと思いました。セシウムは:Drupalの中にページ上のビューアをロード

は私がサイト内のファイルを配置することによって、Drupalのプロジェクトへのセシウムライブラリを追加した/すべて/ライブラリ/セシウム/ Cesium.js資産とウィジェットのフォルダとは、その後も、カスタムモジュールにhook_library_info呼び出すとともに

function cesium_library_info() { 
    $libraries['cesium'] = array(
    'files' => array(
     'js' => 'Cesium.js', 
    ), 
    'path' => 'js', 
    'library path' => libraries_get_path('cesium'), 
    'version' => '1' 
); 
    return $libraries; 
} 

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はセシウムが私の#myappの-セシウム要素にビューアを添付するDrupal.behaviors内から呼び出されるコードが含まれています

私は、次のページのコールバックを返すためにhook_menuを使用しています。

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 
    }); 
    } 
} 

これで、Drupalページのメインコンテナ内の適切な要素にビューアが正常に作成されます。閲覧者は、しかし、コンテンツの完全に無効であり、そして次のエラーがコンソールにあります

Cesium.js:169769 Uncaught TypeError: this._dataSourceAdded is not a function 

「この」の値がnullまたは未定義のではなく、不完全に形成されたビューアを示唆した構造であると思われますオブジェクト。このオブジェクトには、_dataSourceAddedのように、接頭辞がアンダースコアになるすべてのプロパティがありません。

誰にこのような理由があるのか​​についての洞察はありますか?

最後に、これを投稿する直前に、セシウムのDrupalモジュールがあることがわかりました。セシウムのコードベースがpublic://cesium_base_url.jsとして保存されている、hook_libraries_info_alterで何か面白いことがあります。そのアプローチは全く関係している場合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 }    

で発見

参照ラインcesium.moduleで50〜59は、私はわからないんだけど、私はそれがあることをオフのチャンスのために言及する価値があると思いました。いずれにしても、モジュールが動作するかどうかテストするための新鮮なプロジェクトを試したことに言及する必要がありますが、ライブラリをダウンロードするコードを更新する必要があります。なしでロードされたように私もここ8

のDrupal 7とDrupalの両方で、同じエラーで、私は同じような状況を複製したことに言及したいと思います

EDIT

は、コードですjavascを置く

setTimeout(function() { 

    var viewer = new Cesium.Viewer('myApp-cesium', { 
     imageryProvider : new Cesium.createOpenStreetMapImageryProvider({ 
      url : 'http://thebestmaptiles.map.tile.com/', 
     }), 
     baseLayerPicker : false 
    }); 
}, 5000); 

別の更新:、再び、incompetelyロードCesium.Viewerオブジェクトと同じような状況を作成しDrupal.behaviors、 jQueryラッパーの中のriptは何の利益ももたらさないようです。

また、hook_init()関数でライブラリを追加すると効果があるかどうかを確認しようとしましたが、そうではありません。

別の更新:

注目すべき不一致 - Drupalの

対のHelloWorld Appのビューアオブジェクト観測のための環境変数:

私はセシウムのビューア機能の内部ではconsole.logし、「これを」送ります.js、すべてのプライベートプロパティが設定された後(_underscoreのプレフィックスが付いたプロパティ)、Viewerオブジェクトの_dataSourceAdded関数を呼び出す直前(変更された未変更のCesium.jsの169769行)

(にconsole.logに従って(Object.keys(本).LENGTH);)

  • 「ビューアとして認識さ41個の特性 -

    HelloWorldのアプリ :ここ

    console.log(this); 
    var dataSourceLength = dataSourceCollection.length; 
    for (var i = 0; i < dataSourceLength; i++) { 
        this._dataSourceAdded(dataSourceCollection, dataSourceCollection.get 
        (i));   
    

    が主な違いですOBJでキー」の上にループ

  • オブジェクト "" 61のプロパティこれらの

  • がプライベートた見つけ

Drupalのアプリ - 41の特性(Object.keys(本).LENGTH))

  • "オブジェクト" オブジェクトとして認識

  • 見出さ "OBJ内のキー" 上にループ61プロパティ

  • これらのうち0個は私的です。

+0

上記のコードの1つは 'var viewer = Cesium 'です。ビューア... '。ここには 'new'キーワードがありません。 'var viewer = new Cesium.Viewer ...' – emackey

+0

あなたはそうです! 「新規」を追加するとオブジェクトのプロパティの数が大幅に減りますが、データソースはまだロードされていませんが、まだプライベートプロパティがありません。私はすぐに私の質問を更新します。再度、感謝します! –

+0

うん、それはそれを修正!私はあなたにそれらの恩恵のポイントを与えることができるように答えとして何かを投稿してください。あなたが見逃してしまったばかげたことは、あなたがそれを捕まえてうれしい。 –

答えて

4

コード元々ビューアを作成するには、このラインを持っていた以上:

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

それはnewキーワード行方不明になった:newキーワードが正しくの新しいインスタンスを構築するために必要とされている

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

をセシウムビューア。 newの詳細については、this answer on Stack Overflowを参照してください。

3

これについていくつかの進展がありました。 Assets/Widgets/Workersの各ディレクトリは図書館/セシウム/ビルド/セシウム/

のように表示されていましたが、地球儀は正常に機能しているようです制限事項)。しかし、 "this._dataSourceAddedは関数ではありません"というエラーはまだ残っていますが、それでも問題は発生していないようです。

さらなるテストの後に更新します。

+0

更新:データソースを読み込み、読み込むまで、すべての機能が正常であるようです。データソース内のデータはきれいに見えますが、マップ上にフィーチャは構築されません。 –

+0

私はこのエラーを見てきただけで他の参照:https://groups.google.com/forum/#!msg/cesium-dev/MAVRdeFWYjk/s31zbc9tAQAJ –

+0

アップデート:私はDrupal.behaviorsなしでコードを実行しようとしました。代わりに、単にsetTimeout関数の中に置くだけですが、それでも同じエラーメッセージが表示されます。少なくともDrupal.behaviorsはこの問題とは何の関係もないと考えることができます。 –

関連する問題