动态使用Alexa演示语言

时间:2019-01-07 05:14:23

标签: node.js alexa alexa-skill alexa-presentation-language

我正在尝试使用Alexa Presentation Language。我想知道如何在node.js(具体为Binding)中合并动态字符串(例如 Output Speech Title )。

如果我为outputSpeech使用了一些静态字符串并将其放在apl_template_export.json中,则该技能正常运行,并且可以在“设备显示”中看到输出。但是当我尝试使用binding时,该技能失败了。尽管没有错误,但是在“设备显示”中也看不到任何输出(请参见图像)。 enter image description here

这是我到目前为止一直在尝试的:

handlerInput.responseBuilder
            .addDirective({
                  type: 'Alexa.Presentation.APL.RenderDocument',
                  version: '1.0',
                  document: require('./apl_template_export.json'),
                  dataSources: {
                    "bodyTemplate1Data": {
                        "type": "object",
                        "objectId": "bt1Sample",
                        "title": urlParams.type,
                        "textContent": {
                            "primaryText": {
                                "type": "PlainText",
                                "text": outputSpeech
                            }
                        }
                    }
                  }
              })
            .speak(outputSpeech)
            .getResponse();

apl_template_export.json

{
    "type": "APL",
    "version": "1.0",
    "import": [
        {
            "name": "alexa-layouts",
            "version": "1.0.0"
        }
    ],
    "mainTemplate": {
        "parameters": [
            "payload"
        ],
        "items": [
            {
                "type": "Text",
                "text": "${dataSources.bodyTemplate1Data.textContent.primaryText.text}"
            }
        ]
    }
}

如果我将${dataSources.bodyTemplate1Data.textContent.primaryText.text}替换为实际文本(例如“ Hello World” ),则该技能将按预期工作。

我从herehere(原始存储库:https://github.com/alexa-labs/skill-sample-nodejs-level-up-riddles)中引用了

有人可以告诉我这里出了什么问题吗?

更新

我将text变量更改为此:

"items": [
            {
                "type": "Text",
                "text": "Type: ${type}\nDatasources: ${dataSources != null} \nBodyTemplate: ${dataSources.bodyTemplate1Data != null}"
            }
        ]

我将其作为输出:

Type: undefined
Datasources: false 
BodyTemplate: false 

所以问题不在于呈现输出,而是模板无法加载dataSources ,这是实际问题。

它甚至无法加载模板中已定义其值的type变量。

1 个答案:

答案 0 :(得分:2)

如果您要从APL Authoring Tool生成class MyCustomTabBarController: UITabBarController { override func viewDidLoad() { super.viewDidLoad() delegate = self //here's the code that creates no border, but has a shadow: tabBar.layer.shadowColor = UIColor.lightGray.cgColor tabBar.layer.shadowOpacity = 0.5 tabBar.layer.shadowOffset = CGSize.zero tabBar.layer.shadowRadius = 5 self.tabBar.layer.borderColor = UIColor.clear.cgColor self.tabBar.layer.borderWidth = 0 self.tabBar.clipsToBounds = false self.tabBar.backgroundColor = UIColor.white UITabBar.appearance().shadowImage = UIImage() UITabBar.appearance().backgroundImage = UIImage() } } ,则需要记住以下几点:

  1. template添加到directive时,请确保添加名为responseBuilder的{​​{1}}。
  2. 从模板引用key时,请确保将其寻址为datasources。因此,您的datasource被引用为payload

例如:

datasource

如果您要访问payload,则将其引用为datasources : { 'type': 'AlexaHeader', 'text': { 'value': 'Hello World' } }

  1. 如果这些方法无效,请从控制台重新启用APL。