首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >dat.GUI与复变量

dat.GUI与复变量
EN

Stack Overflow用户
提问于 2018-04-25 15:04:34
回答 2查看 692关注 0票数 0

我对dat.GUI相当陌生,而且我在使用一个更复杂的变量时遇到了问题。

我有以下几点:

代码语言:javascript
复制
let complexVariable= {
    topLayer:
        {
            deeperLayer:
                {
                    deepestLayer: 20,
                    //Other stuff                    
                }
        }
}

let gui = new dat.GUI();
gui.add(complexVariable, "topLayer.deeperLayer.deepestLayer", 10, 40);

这给了我以下错误:

代码语言:javascript
复制
Uncaught Error: Object "[object Object]" has no property "topLayer.deeperLayer.deepestLayer"

这里的任何帮助都将不胜感激。

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2018-04-25 16:00:13

目前看来,通过查看源代码似乎是不可能的。它们在对象上传递的单个属性中使用括号表示法。

代码语言:javascript
复制
function add(gui, object, property, params) {
  if (object[property] === undefined) {
    throw new Error(`Object "${object}" has no property "${property}"`);
  }
...

因此,您告诉dat.GUI要做的是查找顶级属性"topLayer.deeperLayer.deepestLayer“,而该属性显然不存在于您的对象上。似乎需要编写更多的代码来支持嵌套属性。

dat.gui必须做一些像if (object[property1][property2][...] === undefined)这样的事情,或者在您的情况下- complexVariable["topLayer"]["deeperLayer"]["deepestLayer"];

票数 1
EN

Stack Overflow用户

发布于 2021-10-21 21:49:28

很明显,这个问题已经4岁了。但我正在寻找同样的问题,在意识到这是可能的之前,我找到了你的问题。下面是E2E样品的角度。

代码语言:javascript
复制
import { AfterViewInit, Component, ViewChild, ViewContainerRef } from '@angular/core';
import { GUI, GUIController, GUIParams } from 'dat.gui';

export type EditorMetadata = Array<IEditorFolder>;
export interface IDatState {
  state: EditorMetadata;
  instance: GUI;
  metadata: EditorMetadata;
}
export interface IEditorFolder {
  title: string;
  property?: string;
  tooltip: string;
  elements?: Array<IEditorElement>;
  folders?: Array<IEditorFolder>;
  folderRef?: GUI;
}
export interface IEditorElement {
  title: string;
  tooltip: string;
  options?: any;
  elementRef?: GUIController;
  target?: Object;
}

@Component({
  selector: 'app-root',
  templateUrl: './app.component.html',
  styleUrls: ['./app.component.scss']
})
export class AppComponent implements AfterViewInit {
  @ViewChild('container', { read: ViewContainerRef, static: true })
  container: ViewContainerRef;

  constructor() { }
  ngAfterViewInit(): void {
    this.composeEditor(this.container.element.nativeElement, options, foldersMetadata);
  }

  composeEditor(container: HTMLElement, editorOptions: GUIParams, editorMetadata: EditorMetadata): IDatState {
    const
      addFolder = (folder: IEditorFolder, parent: GUI): GUI => {
        const
          { title, tooltip } = folder,
          folderController = parent.addFolder(title);

        folderController.domElement.setAttribute('title', tooltip);
        return folderController;
      },
      addElement = (folder: GUI, element: IEditorElement, target: Object): GUIController => {
        const
          { title, options, tooltip } = element,
          elmController = folder
            .add(target, title, options)
            .name(title)
            .onChange((value) => {
              console.log(model);
            });

        elmController.domElement.setAttribute('title', tooltip);
        return elmController;
      },
      createDat = (options: GUIParams, metadata: EditorMetadata): IDatState => {
        const
          state: IDatState = {
            instance: new GUI(options),
            state: JSON.parse(JSON.stringify(metadata)), // Don't touch original metadata, instead clone it.
            metadata: metadata, // Return original metadata
          };

        return state;
      },
      process = (folders: EditorMetadata, parent: GUI, model: Object): void => {
        folders.forEach(folder => {
          const target: Object = folder.property ? model[folder.property] : model; // Root level or object nested prop?
          folder.folderRef = addFolder(folder, parent);
          folder.elements && folder.elements.forEach(element => element.elementRef = addElement(folder.folderRef, element, target));
          folder.folders && process(folder.folders, folder.folderRef, target);
        });
      },
      { state, instance, metadata } = createDat(editorOptions, editorMetadata);

    process(state, instance, model);
    container.appendChild(instance.domElement);
    return { state, instance, metadata };
  }
}

const options: GUIParams = {
  hideable: false,
  autoPlace: false,
  closeOnTop: false,
  width: 250,
  name: 'DAT Sample'
};

const model = {
  rtl: true,
  renderer: 'geras',
  theme: 'dark',
  toolbox: 'foundation',
  toolboxPosition: 'left',
  debug: {
    alert: false
  }
};

const foldersMetadata: EditorMetadata = [
  {
    title: 'Options',
    tooltip: 'Options AA',
    elements: [
      {
        title: 'rtl',
        tooltip: 'RTL',
      },
      {
        title: 'renderer',
        tooltip: 'Renderer',
        options: ['geras', 'thrasos', 'zelos']
      },
      {
        title: 'theme',
        tooltip: 'Theme',
        options: ['classic', 'dark', 'deuteranopia', 'tritanopia', 'highcontrast']
      },
      {
        title: 'toolbox',
        tooltip: 'Toolbox',
        options: ['foundation', 'platform', 'invoice']
      },
      {
        title: 'toolboxPosition',
        tooltip: 'Toolbox Position',
        options: ['left', 'right', 'top', 'bottom']
      },
    ],
    folders: [
      {
        title: 'Debug',
        property: 'debug',
        tooltip: 'Debug mode',
        elements: [
          {
            title: 'alert',
            tooltip: 'Alert Tooltip',
          },
        ]
      }
    ]
  },
];

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/50025604

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档