重要な注意 通常のプロジェクトにおけるセシウムオブジェクトをインスタンス化する場合、それはアンダースコア(_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個は私的です。
上記のコードの1つは 'var viewer = Cesium 'です。ビューア... '。ここには 'new'キーワードがありません。 'var viewer = new Cesium.Viewer ...' – emackey
あなたはそうです! 「新規」を追加するとオブジェクトのプロパティの数が大幅に減りますが、データソースはまだロードされていませんが、まだプライベートプロパティがありません。私はすぐに私の質問を更新します。再度、感謝します! –
うん、それはそれを修正!私はあなたにそれらの恩恵のポイントを与えることができるように答えとして何かを投稿してください。あなたが見逃してしまったばかげたことは、あなたがそれを捕まえてうれしい。 –