Drupal中的铯:在Drupal中的页面上加载查看器

Drupal中的铯:在Drupal中的页面上加载查看器,drupal,drupal-7,drupal-8,cesium,Drupal,Drupal 7,Drupal 8,Cesium,重要提示 在普通项目中实例化铯对象时,它没有任何以下划线作为前缀的属性(_dataSourceCollection、_dataSourceDisplay等)。但是,在Drupal中实例化时,除了通常的属性外,对象上还设置了大约40-45个属性(所有属性的前缀都带有下划线)。这发生在Drupal7或8中,虽然我不确定这是否与我遇到的问题有关,但这是一个明显的差异,因此我认为应该分享 我已经将铯库添加到Drupal项目中,方法是将文件与资产和小部件文件夹一起放在sites/all/libraries

重要提示 在普通项目中实例化铯对象时,它没有任何以下划线作为前缀的属性(_dataSourceCollection、_dataSourceDisplay等)。但是,在Drupal中实例化时,除了通常的属性外,对象上还设置了大约40-45个属性(所有属性的前缀都带有下划线)。这发生在Drupal7或8中,虽然我不确定这是否与我遇到的问题有关,但这是一个明显的差异,因此我认为应该分享

我已经将铯库添加到Drupal项目中,方法是将文件与资产和小部件文件夹一起放在sites/all/libraries/Cesium/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;
}
然后,我使用hook_菜单返回以下页面回调:

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;
}
这将成功地在Drupal页面的主容器内的适当元素上创建查看器。但是,查看器完全没有内容,并且在控制台中发现以下错误:

Cesium.js:169769 Uncaught TypeError: this._dataSourceAdded is not a function
“this”的值不是null或未定义的,但似乎是表示未完全形成的查看器对象的结构。此对象缺少所有以下划线作为前缀的属性,例如_dataSourceAdded

有人知道为什么会这样吗

最后,在发布这篇文章之前,我看到了一个用于铯的Drupal模块,它在hook_libraries_info_alter中发生了一些有趣的事情,铯代码库被保存为public://cesium_base_url.js.

参见铯模块中的第50-59行

我不确定这种方法是否有任何关联,但我认为值得一提的是,这种可能性很小。无论如何,我还应该提到,我尝试了一个新的项目来测试该模块是否可以工作,但我相信下载库的代码必须更新

编辑

我还想提到的是,我在Drupal7和Drupal8上复制了相同的情况和错误

下面是在没有Drupal.behaviors的情况下加载的代码,它再次使用未完全加载的Cesium.Viewer对象创建了相同的情况:

setTimeout(function() {

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

将javascript放在jQuery包装器中似乎没有任何好处

我还试着看看在hook_init()函数中添加库是否有帮助,但是没有

另一更新:

值得注意的差异-HelloWorld应用程序与Drupal中的查看器对象

观测的环境变量:

在设置了所有私有属性(属性前缀为_下划线)之后,在查看器对象上调用_dataSourceAdded函数之前(在我修改的未统一的Cesium.js上,第169769行),我正在将“this”发送到Cesium.js的查看器函数中的console.log

console.log(这个);
var dataSourceLength=dataSourceCollection.length;
对于(var i=0;i
主要区别如下:

HelloWorld应用程序 -41个属性(根据console.log(Object.keys(this.length);)

  • 识别为“查看器”对象

  • 在“key in obj”上循环找到61个属性

  • 其中53个是私人的

Drupal应用程序 -41属性(Object.key(this.length))

  • 识别为“对象”对象

  • 在“key in obj”上循环找到61个属性

  • 其中0个是私人的


在这方面取得了一些进展。事实证明,每个资产/widget/Workers目录都必须位于libraries/cesium/Build/cesium中/

现在,globe看起来正常,似乎正在运行(需要测试以查看是否存在限制)。但是,“this.\u dataSourceAdded不是函数”错误仍然存在,尽管据我所知,它似乎没有引起任何问题


我将在进行更多测试后进行更新。

上面的代码最初有一行代码用于创建查看器:

var viewer = Cesium.Viewer('myApp-cesium',
缺少
new
关键字:

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

要正确构建铯查看器的新实例,需要使用
new
关键字。有关
new
的具体功能,请参阅。

Update:在我尝试加载数据源之前,所有功能似乎都正常。数据源中的数据看起来很好,但地图上没有构建任何功能。唯一的其他参考我已经看到了这个错误:更新:我尝试在没有Drupal.behaviors的情况下运行代码。相反,我只是将它放在一个setTimeout函数中,但它仍然会产生相同的错误消息。至少我们可以假设Drupal.behaviors与问题无关。上面的一段代码是
var viewer=Cesium.viewer…
.Y您缺少一个
new
关键字。
var-viewer=new-Cesium.viewer…
您说得对!添加“new”大大减少了对象上的属性数量,尽管它仍然没有加载数据源,并且仍然缺少任何私有属性。我将很快更新我的问题。再次感谢!是的,这修复了它!请发布一些内容作为答案,这样我就可以给你那些悬赏点数。错过了一件多么愚蠢的事情……很高兴你抓住了它。
console.log(this);
var dataSourceLength = dataSourceCollection.length;
for (var i = 0; i < dataSourceLength; i++) {
    this._dataSourceAdded(dataSourceCollection, dataSourceCollection.get
   (i));          
var viewer = Cesium.Viewer('myApp-cesium',
var viewer = new Cesium.Viewer('myApp-cesium',