Personalizar la aplicación

Funcionalidad expuesta en el marco de extensión

Hemos expuesto un conjunto de funciones y captadores bajo un proxy que puede usarse para acceder a datos y eventos de configuración y déclencheur. A continuación se muestra una lista y cómo acceder a ellas.

interface EventData {
  key?: string,
  keys?: string[]
  view?: any,
  next?: any,
  error?: any,
  completed?: any,
  id?: any
}

* getValue(key)
* setValue(key, value)
* subject // getter
* subscribe(opts: EventData)
* subscribeAppEvent(opts: EventData)
* subscribeAppModel(key, next)
* subscribeParentEvent(opts: EventData)
* parentEventHandlerNext(eventName: string, opts: any)
* appModelNext(eventName:string, opts)
* appEventHandlerNext(eventName:string, opts)
* next(eventName:string, opts, eventHandler?)
* viewConfig //getter
* args //getter

Nuestra aplicación sigue una estructura MVC (Modelo, Vista, Controlador)

Modelo

El modelo define los distintos atributos y almacena sus valores. Se puede acceder a los valores de los distintos atributos almacenados en el modelo desde el controlador mediante la sintaxis

this.getValue('attributeName')

Para la personalización en la aplicación, todos los atributos recién creados se añadirán en un mapa del modelo.
Para establecer un nuevo atributo en el modelo, se utilizará la siguiente sintaxis en el controlador:

// If a key is not already in model then it will be added to extraProps
this.setValue('key', value)

Para acceder a un atributo añadido al modelo utilizaremos la siguiente sintaxis:

const value = this.getValue("key")

Ver

La vista define la interfaz de usuario de la aplicación. Utilizamos archivos JSON para definir la vista de nuestros archivos. Aquí, definimos los componentes, el css (como se indica en la clase extra de componentes) y procesamos los valores almacenados en el modelo.
En nuestra aplicación, cada vista se define mediante un JSON. Se hace referencia a los JSON mediante sus identificadores únicos denominados id.

Controlador

El controlador se utiliza para controlar eventos y procesar los datos. El controlador se utiliza para recuperar y enviar datos desde el servidor, es la interfaz entre lo que se muestra en la interfaz de usuario y lo que se almacena en el servidor.

  • Para establecer los valores en la inicialización, se utiliza la función init.
  • Para agregar un método al controlador utilizamos la siguiente sintaxis:
methodName: function(args){
    // functionality
}

El methodName sirve como key para hacer referencia al método en el JSON (vista) o en otras funciones

  • Para llamar a un método en el controlador utilizamos la sintaxis
this.next('methodName', args)

Ejemplos

Veamos un ejemplo sencillo para mostrar cómo estos 3 componentes interactúan entre sí.
Agregaremos un botón que cambia su valor de etiqueta con un clic

Ver ejemplo

A continuación, definimos el JSON de un botón que muestra un texto dinámico almacenado en el modelo bajo el nombre de variable buttonLabel.
En este ejemplo, al hacer clic en el botón se cambia la etiqueta.

{
    "component": "button",
    "label": "@extraProps.buttonLabel",
    "variant": "cta",
    "on-click": "switchButtonLabel",
}

Ejemplo de modelo

en este caso, extraProps.buttonLabel contiene la etiqueta del botón

Ejemplo del controlador

  controller: {
    init: function () {
      this.setValue("buttonLabel", "Submit")
    },

    switchButtonLabel(){
        const buttonLabel = this.getValue("buttonLabel") === "Submit"? "Cancel" : "Submit"
        this.setValue("buttonLabel", buttonLabel)
    }
  }

El siguiente GIF muestra el código anterior en acción
personalización_básica

Ver ejemplo de configuración

En este caso, accedemos al evento de modo de búsqueda mediante viewConfig y almacenamos en déclencheur un evento para actualizarlo

  {
    id: 'repository_panel',
    controller: {
      init: function () {
        console.log('Logging view config ', this.viewConfig)
        this.next(this.viewConfig.items[1].searchModeChangedEvent, { searchMode: true })
      }
    }
  }

Ejemplo de suscripción

En este caso, agregamos la suscripción al nombre de archivo al registro de la consola cuando se hace clic en la opción de nombre de archivo

  {
    id: 'repository_panel',
    controller: {
      init: function () {
        this.subscribe({
          key: 'rename',
          next: () => { console.log('rename using extension') }
        })
      }
    }
  }

Ejemplo de evento de suscripción de aplicación

En este caso, se cambia el inicio de sesión en la consola del documento activo (cambiando pestañas en la interfaz de usuario del editor)

  {
    id: 'repository_panel',
    controller: {
      init: function () {
        this.subscribeAppEvent({
          key: 'app.active_document_changed',
          next: () => { console.log('Extension: active document changed') }
        })
      }
    }
  }

Ejemplo de suscripción de eventos del modelo de aplicación

Ejemplo de suscripción de eventos de modelo de aplicación como app.mode

  {
    id: 'repository_panel',
    controller: {
      init: function () {
        this.subscribeAppModel('app.mode',
          () => { console.log('app mode subs') }
        )
      }
    }
  }

Ejemplo de eventos del controlador principal

En este caso, agregamos la suscripción al evento tabChange, que es un evento del controlador left_panel_container que actúa
como controlador principal de repository_panel

  {
    id: 'repository_panel',
    controller: {
      init: function () {
        this.subscribeParentEvent({
          key: 'tabChange',
          next: () => { console.log('tab change subs') }
        })
        this.parentEventHandlerNext('tabChange', {
          data: 'map_panel'
        )
      }
    }
  }

Modelo de aplicación y controlador de aplicación siguiente

Se pueden activar directamente conociendo el evento correcto para activar y sus datos

  {
    id: 'file_options',
    controller: {
      init: function () {
        this.appModelNext('app.mode', 'author')
        this.appEventHandlerNext('app.active_document_changed', 'active doc changed')
      }
    }
  }
recommendation-more-help
11125c99-e1a1-4369-b5d7-fb3098b9b178