learn - ¿Puedo suscribirme a Meteor Session para obtener actualizaciones de plantillas reactivas?
meteor tutorial español (4)
¿Hay alguna forma de suscribirse al objeto Meteor Session para que una vista reactiva de la plantilla aparezca automáticamente cuando los datos están configurados en el objeto Session? Específicamente la clave / nombre y datos de valor?
Tengo una pregunta similar relacionada con la representación de los datos del objeto Meteor Session cuando se repiten. Esta pregunta es específicamente diferente a propósito. Quiero obtener una respuesta de una manera alternativa y posiblemente una mejor manera de hacer lo mismo.
No quiero tener que llamar a Session.get (''nombre''); Este caso de uso se debe a que no conozco los nombres en el objeto Session.
Entonces, me gustaría poder tener algo en el manillar que me permita
Código de Psuedo ...
{{#each Session}}
{{this.key}} {{this.value}}
{{/each}}
No está seguro de suscribirse a la sesión, pero para la segunda parte de su pregunta, puede usar esto:
Template.hello.session = function () {
map = []
for (prop in Session.keys) {
map.push({key: prop, value: Session.get(prop)})
}
return map
}
luego en tu plantilla:
{{#each session}}
{{key}} {{value}}
{{/each}}
No estoy seguro si hay una manera más elegante pero funciona.
No lo creo.
Eche un vistazo a https://github.com/meteor/meteor/blob/master/packages/session/session.js . En realidad es razonablemente simple. La invalidación ocurre en las líneas 45-47. Verá que llama Session.set
invalida a cualquiera que escuche esa clave específicamente (a través de Session.get
) o al valor nuevo o antiguo (a través de Session.equals
). Nada sobre invalidar la sesión como un todo.
Por otro lado, teniendo en cuenta lo simple que es, no sería muy difícil escribir su propia estructura de datos que hace lo que quiere. No estoy seguro de cuál es su caso de uso, pero podría tener mucho sentido separarlo de la sesión.
Sí, puedes suscribirte a los valores de la sesión.
Eche un vistazo a los documentos para autosuscribirse:
http://docs.meteor.com/#meteor_autosubscribe
// Subscribe to the chat messages in the current room. Automatically
// update the subscription whenever the current room changes.
Meteor.autosubscribe(function () {
Meteor.subscribe("chat", {room: Session.get("current-room");});
});
Este bloque de código muestra una forma de usar esto. Básicamente cada vez que se cambie el valor de "habitación actual", Meteor actualizará las vistas.
EDITAR
No entendí bien la pregunta inicial y decidí que debía redimirme un poco. Acabo de hacer algunas pruebas y, por lo que puedo decir, actualmente solo puede suscribirse a las llamadas collection.find () y session.get (). Por lo tanto, no puede suscribirse al objeto de sesión completo o incluso al objeto de claves.
Sin embargo, puede establecer un valor de sesión para un objeto. Puede que esta no sea la solución más elegante, pero esto funcionó para mí en el seguimiento del objeto de claves con algunos hackers para evitar que se produzca un error de objeto circular.
var mySession = {
set: function(key, val){
var keys = Session.keys,
map = {};
Session.set(key, val);
for (var prop in keys) {
if(!(prop === "keys")){
map[prop] = keys[prop];
}
}
Session.set(''keys'', map);
}
};
Esto le proporciona algo que se parece mucho a la funcionalidad original y puede ayudarlo a seguir y actualizar las plantillas a medida que agrega o cambia los valores de la Sesión.
Aquí está mi ayudante de plantilla (tomado de la respuesta anterior):
Template.hello.keys = function() {
map = [];
keys = Session.get(''keys'');
for (var prop in keys) {
map.push({key:prop, value:keys[prop]});
}
return map
};
Y aquí está la plantilla real:
<template name="hello">
<div class="hello">
{{#each keys}}
{{key}} {{value}} <br />
{{/each}}
</div>
</template>
De esta forma, puede llamar a mySession.set ("cosa", "otra cosa") y se actualizará en la pantalla. Soy nuevo en Javascript, así que, por favor, avíseme si me falta algo obvio aquí, o avíseme si hay una forma más elegante de hacerlo.
Mientras que acceder al objeto de la sesión de esta manera es factible ... No estás bebiendo el socorro.
En otras palabras, Meteor sobresale en el respeto de tener publicar / suscribirse. No está claro (para mí) cuántos datos tienes que poner en el objeto Session antes de que un navegador falle; Prefiero no descubrirlo.
Simplemente pondría todo su código dependiente de la sesión en una función Deps.autorun () para conectar suscripciones como se menciona en una respuesta anterior. Cada vez que una sesión cambia, modificará la suscripción; puede adjuntar una devolución de llamada lista, o usar las comprobaciones de subscription.ready () para iniciar acciones específicas, pero lo ideal es estructurar sus plantillas de forma que pueda usar funciones renderizadas / destruidas, teniendo cuidado de usar {{isolate}} / {{constant}} cuando sea posible.
Lo que estás logrando es una manera bastante difícil de hacer algo simple; y puede que no se adhiera a los cambios en meteoritos en el futuro; siempre podemos estar seguros de que publicar / suscribir funcionará como se espera ... La sesión dada es un objeto tan simple ... qué decir que alguien diseña algo mejor en breve ... y se fusiona en meteoro; y te queda un flujo de trabajo extraño basado en objetos personalizados que pueden no romper la sesión; pero puede afectar otras partes de su interfaz.