Accediendo a variables en un conector

Soy muy bueno en administración de sistemas. No me va mal haciendo cosas en Rails. Pero con JavaScript, Ember y CSS, soy como un hombre de las cavernas.

En un plugin que cambia quién puede enviar mensajes privados (PM), estoy intentando agregar un botón en la página de perfil cuando el usuario no tiene permiso para enviar un PM. Puedo agregar texto justo donde quiero poniendo cosas en assets/javascripts/discourse/templates/connectors/user-summary-stat/my-clever-name.hbs. (¡Hubo muchas celebraciones!).

Veo que https://github.com/discourse/discourse/blob/master/app/assets/javascripts/discourse/templates/user/messages.hbs#L3 utiliza

    {{#if showNewPM}}

Me gustaría usar eso en my-clever-name.hbs, pero esa variable no está definida.

Creo que tal vez necesito crear un archivo my-clever-name.js.es6 en el mismo directorio que mi archivo hbs e incluir… algo, y/o agregar algún código que defina esa variable para que pueda acceder a ella. Sin embargo, he releído la guía para desarrolladores varias veces y también he intentado imitar el código de algunos plugins que parecen estar haciendo lo mismo, pero no veo exactamente cómo hacerlo.

2 Me gusta

Hola Jay,

¡He oído a la gente decir que EmberJS es “un lenguaje en sí mismo”!

Lo que necesitas es una Propiedad Computada:

Aunque la sintaxis del código fuente de Discourse es un poco diferente, al igual que las importaciones, lo mejor es buscar un ejemplo. Aquí tienes un fragmento de mi código:

https://github.com/paviliondev/discourse-zspace/blob/cc8893c14a9b1c5d4f6552f8f6b12ea9ac7ac643/assets/javascripts/discourse/components/activity-file-edit.js.es6#L10

2 Me gusta

¿Entonces, @discourseComputed("uploading") permite que uploading se use en una plantilla hbs? Algo así como:

fullName: computed('firstName', 'lastName', function() {
    return `${this.firstName} ${this.lastName}`;
  })

en Ember?

¿Entonces crearé assets/javascripts/discourse/components/my-plugin.js.es6 y extenderé… algo…? Parece que debería haber una forma de simplemente “activar” esas mismas variables a las que tiene acceso la otra plantilla que estoy extendiendo. ¡AH! ¿Quizás extender esa cosa en mi componente haría que esas variables estuvieran disponibles para mí?

¿Debería rendirme, retroceder y dedicar una semana al tutorial de Ember?

Esto configura una propiedad computada llamada ‘fullName’ que se actualiza cada vez que cambian ‘firstName’ o ‘lastName’. Se convierte en el valor de retorno.

1 me gusta

¡Gracias por tu paciencia!

Creo que lo entiendo, lo que no entiendo es cómo puedo hacer valores a los que pueda acceder en mi plantilla.

assets/javascript/discourse/components/user-private-messages.js.es6:

import discourseComputed from "discourse-common/utils/decorators";
import User from "discourse/controllers/user";

export default Ember.Component.extend(User, {
    classNames: ["restrict-pms"],
    myFunThing: "this is text in my fun thing",
    @discourseComputed("myvalue")
    someThing(myvalue) {
        return true;
    }
});

Template.registerHelper("log", function(something){
    console.log(something);
});

Creo que lo que pregunto, lo cual podría no tener sentido, es qué puedo poner en assets/javascripts/discoures/templates/connectors/user-profile-controls/add-link-to-subscription.hbs para poder acceder a myFunThing o myvalue?

La plantilla que corresponde a tu componente JS puede hacer referencia a tu propiedad calculada simplemente incluyéndola entre llaves dobles:

{{fullName}}

1 me gusta

El código anterior está en assets/javascript/discourse/components/user-private-messages.js.es6.

Y quiero poder usar {{myFunThing}} y/o {{myvalue}} en assets/javascripts/discourse/templates/connectors/user-profile-controls/add-link-to-subscription.hbs, pero están sin definir.

Creo que uno de esos archivos está en el lugar incorrecto (veo que otro texto en el archivo hbs anterior se muestra en /u/username/summary, solo que sin myFunThing), o que estoy importando la clase incorrecta y/o estoy extendiendo el componente equivocado.

Lo siento, Jay, estoy un poco ocupado, pero lo que puedes hacer es simplemente conectar tu componente en el archivo HBS dentro del conector HBS, por ejemplo:

{{my-component}}

(agrega los argumentos según sea necesario)

Luego buscará my-component.hbs en templates/components y /components.

Alternativamente, deberías poder establecer la propiedad en el archivo JS dentro del directorio del conector, pero para mi estilo prefiero el primer enfoque.

2 Me gusta

Sé que esto es de hace un año, pero ¿lograste resolverlo, @pfaffman?

Espero que esto no fuera para el mismo proyecto (inacabado), pero aquí está:

https://github.com/pfaffman/discourse-pfaffmanager/blob/master/assets/javascripts/discourse/templates/pfaffmanager-servers-show.hbs

Eso llama a:

https://github.com/pfaffman/discourse-pfaffmanager/blob/master/assets/javascripts/discourse/templates/components/server-item.hbs

Y, creo que:

https://github.com/pfaffman/discourse-pfaffmanager/blob/master/assets/javascripts/discourse/controllers/pfaffmanager-servers-show-item.js.es6

1 me gusta