Personalizzazione dell’app

Funzionalità esposte nel framework dell’estensione

È stato esposto un set di funzioni e getter in un proxy che possono essere utilizzati per accedere ai dati, configurare ed attivare gli eventi. Di seguito è riportato un elenco e le modalità di accesso.

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

La nostra app segue una struttura MVC (Model, View, Controller)

Modello

Il modello definisce i vari attributi e ne memorizza i valori. È possibile accedere ai valori dei vari attributi memorizzati nel modello dal controller utilizzando la sintassi

this.getValue('attributeName')

Per la personalizzazione nell’app, tutti i nuovi attributi creati verranno aggiunti sotto una mappa nel modello.
Per impostare un nuovo attributo nel modello, verrà utilizzata la seguente sintassi nel controller:

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

Per accedere a un attributo aggiunto al modello verrà utilizzata la sintassi seguente:

const value = this.getValue("key")

Visualizzazione

La vista definisce l’interfaccia utente dell’app. Utilizziamo i file JSON per definire la visualizzazione dei nostri file. In questo caso, definiamo i componenti, il css (come indicato nell’extraclass dei componenti) ed eseguiamo il rendering dei valori memorizzati nel modello.
Nell’app, ogni visualizzazione è definita utilizzando un JSON. Viene fatto riferimento ai JSON utilizzando i loro ID univoci denominati id.

Controller

Il controller viene utilizzato per gestire gli eventi ed elaborare i dati. Il controller viene utilizzato per recuperare e inviare dati dal server, è l’interfaccia tra ciò che viene visualizzato nell’interfaccia utente e memorizzato nel backend.

  • Per impostare i valori all'inizializzazione, si utilizza la funzione init.
  • Per aggiungere un metodo al controller si utilizza la seguente sintassi:
methodName: function(args){
    // functionality
}

methodName funge da key per fare riferimento al metodo nel JSON (visualizzazione) o in altre funzioni

  • Per chiamare un metodo nel controller viene utilizzata la sintassi
this.next('methodName', args)

Esempio

Ora utilizziamo un semplice esempio per mostrare come questi 3 componenti interagiscono tra loro.
Aggiungeremo un pulsante per cambiare il valore dell’etichetta quando si fa clic su

Esempio di visualizzazione

Di seguito viene definito il JSON per un pulsante che mostra un testo dinamico memorizzato nel modello con il nome della variabile buttonLabel.
In questo esempio, facendo clic sul pulsante ne cambia l’etichetta.

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

Esempio di modello

in questo caso, extraProps.buttonLabel contiene l'etichetta del pulsante

Esempio di controller

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

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

Sotto GIF mostra il codice di cui sopra in azione
personalizzazione di base

Esempio di configurazione della visualizzazione

In questo caso, l'evento della modalità di ricerca verrà aperto utilizzando viewConfig e verrà attivato un evento per aggiornarlo

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

Esempio di abbonamento

In questo caso, quando si fa clic sull’opzione Rinomina file, viene aggiunta la sottoscrizione al registro della console al momento della ridenominazione

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

Esempio di evento "Subscribe app"

In questo caso, l’accesso al documento attivo viene console modificato (modifica delle schede nell’interfaccia utente dell’editor)

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

Esempio di eventi del modello di app Subscribe

Esempio per la sottoscrizione di eventi del modello di app come app.mode

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

Esempio di eventi del controller padre

In questo viene aggiunta la sottoscrizione all'evento tabChange che è un evento del controller left_panel_container che agisce
come controller padre per repository_panel

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

Modello app e controller app successivo

Possono essere attivati direttamente conoscendo l’evento corretto da attivare e i relativi dati

  {
    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