dashboard解析

plugins/dashboard/index.js 结构跟 visualize 类似,注册到 registry;设置两个调用 savedDashboards.get() 方法的 routes,提供一个叫 dashboard-app 的 directive。

savedDashboards 由 plugins/dashboard/services/saved_dashboard.js 提供,调用 es.search 获取数据,生成 savedDashboard 对象,这个对象同样也是继承 savedObject,主要内容是 panelsJSON 数组字段。实现如下:

  module.factory('SavedDashboard', function (courier) {
    _.class(SavedDashboard).inherits(courier.SavedObject);
    function SavedDashboard(id) {
      courier.SavedObject.call(this, {
        type: SavedDashboard.type,
        mapping: SavedDashboard.mapping,
        searchSource: SavedDashboard.searchsource,
        id: id,
        defaults: {
          title: 'New Dashboard',
          hits: 0,
          description: '',
          panelsJSON: '[]',
          version: 1,
          timeRestore: false,
          timeTo: undefined,
          timeFrom: undefined
        },
        clearSavedIndexPattern: true
      });
    }

可以注意到,这个 panelsJSON 是一个字符串,这跟之前 kibana_index 提到的是一致的。

dashboard-app 中,最重要的功能,是监听搜索框和过滤条件的变更,我们可以看到 init 函数中有下面这段:

在 index.html 里,实际承载面板的,是下面这行:

这也是一个 angular directive,通过加载 plugins/dashboard/directives/grid.js 引入的。其中添加面板相关的代码有两部分:

这段用来监听 $state.panels 数组,一旦有新增面板,调用 addPanel 函数。同理也有删除面板的,这里就不重复贴了。

而 addPanel 函数的实现大致如下:

这里即验证了之前 kibana_inex 小节中讲的 gridster 默认大小,又引入了一个新的 directive,叫 dashboard-panel。

dashboard-panel 在 plugins/dashboard/components/panel/panel.js 中实现,其中使用了 plugins/dashboard/components/panel/panel.html 页面。页面最后是这么一段:

这里使用的 savedObj 对象,来自 plugins/dashboard/components/panel/lib/load_panel.js 获取的 savedSearch 或者 savedVisualization。获得的对象,以 savedVisualization 为例:

而 visualize 和 doc-table 两个 directive。这两个正是之前在 visualize 和 discover 插件解析里提到过的,在 components/ 底下实现。

Last updated

Was this helpful?