¿Cómo pasar un parámetro más que no sea la opción de la intención que muestra el carrusel a la intención que maneja el carrusel?
Estoy usando una intención de presentar primero el carrusel al usuario. Cuando el usuario hace clic en una de las opciones del carrusel, en la intención del controlador obtengo la clave del elemento del carrusel que seleccionó el usuario.
Ejemplo de intención de carrusel,
app.intent('search', async (conv,params) => {
conv.ask(`Choose one item`,new Carousel({
title :`Search results`,
items : carouselItems,
}));
});
Ejemplo de la intención del controlador,
app.intent('handle_carousel', async (conv,params,option) => {
const key = parseInt(option);
});
Sin embargo, junto con la clave de la opción seleccionada, también quiero pasar otro número entero de la intención del carrusel a la intención del controlador. Este otro entero es diferente para cada opción. Puede pensar en el otro entero como una identificación, es único para cada opción. ¿Cómo puedo lograr eso?
Respuestas
Tiene algunos enfoques para pasar datos adicionales que deben asociarse con cada clave.
El primero es, como observa en su respuesta, almacenar esa asignación en una tabla que se almacena como parte de los datos de la sesión (ya sea usando conv.data
o un contexto de Dialogflow).
Otra es codificar esos datos como parte de la clave que incluye con cada opción y luego decodificar la clave cuando la recupere.
Entonces, por ejemplo, podría hacer que la clave sea el resultado de una función de codificación como
function encodeOptionKey( key, otherValue ){
return `${key}:${otherValue}`
}
y luego decodificarlo con una función como
function decodeOptionKey( option ){
const [key,otherValue] = option.split(':');
return {
key,
otherValue
}
}
y llame a esto desde su controlador con algo como
app.intent('handle_carousel', async (conv,params,option) => {
const {key, otherValue} = decodeOptionKey( option );
// ...
});
Creé un mapa de las claves de varias opciones de carrusel y el parámetro correspondiente que quería pasar, guardé ese mapa en conv.data.store, que es el almacenamiento de conversación proporcionado por acciones en Google. Luego usé ese mapa para obtener el parámetro de la clave del carrusel que se estaba pasando a la intención del controlador.
Por ejemplo, en la intención del carrusel:
let map = {
keyofcarousel : option,
other_parameter : otherparam,
};
conv.data.store = map;
Luego llame a conv.data.store en la intención del controlador.