有谁知道如何使用TVJS / TVML在Apple TV应用中动态生成模板?基本上我想点击我的API,获取一个对象数组,然后将这些数据插入到我的XML模板中。
我一直在寻找有关如何实现这一目标的信息,但已经做得很短。我发现很多教程都使用硬编码图像,视频等,但没有动态生成。
任何帮助都将不胜感激。
答案 0 :(得分:6)
最后,我发现了这一点。在运行中生成模板并不困难,但我想重用Presenter和ResourceLoader,并将模板作为* .xml.js文件。这是我设法达成的解决方案。
对于初始视图,我使用了catalogTemplate
,如Ray Wenderlich's tutorial中所示。然而,我没有参加会议,而是展示了男士和女士的商品。选择一个类别后,我想显示一个stackTemplate
,其中包含该类别的多个选项。问题是如何将任何信息(最简单的情况下的类别标题)传递给第二个模板。
在第一个模板中,我的锁定配置如下:
<lockup categoryTitle="Women: Dresses" categoryDir="w-dresses">
<img src="${this.BASEURL}images/dresses.jpg" width="230" height="288" />
<title>Dresses</title>
</lockup>
在application.js
中,我附加了一个监听器,就像教程显示的那样:
doc.addEventListener("select", Presenter.load.bind(Presenter));
这是第二个模板(Category.xml.js):
var Template = function(categoryTitle) {
return `<?xml version="1.0" encoding="UTF-8" ?>
<document>
<stackTemplate>
<banner>
<title>${categoryTitle}</title>
</banner>
</stackTemplate>
</document>`
}
这是一个JavaScript,因此在您的情况下,您可以传入函数,比如一组值,然后相应地构造模板。棘手的部分是传递一个值。
首先,我对ResourceLoader进行了一些更改(这可以做得更好,当然,它只是一个概念证明)。我只是将categoryTitle
添加为顶级函数的附加参数,并在调用Template
时添加:
ResourceLoader.prototype.loadResource = function(resource, callback, categoryTitle) {
var self = this;
evaluateScripts([resource], function(success) {
if(success) {
var resource = Template.call(self, categoryTitle);
callback.call(self, resource);
} else {
var title = "Resource Loader Error",
description = `Error loading resource '${resource}'. \n\n Try again later.`,
alert = createAlert(title, description);
navigationDocument.presentModal(alert);
}
});
}
最后,在Presenter
,load
中,我将categoryTitle
传递给resourceLoader
:
load: function(event) {
var self = this,
ele = event.target,
categoryTitle = ele.getAttribute("categoryTitle");
if (categoryTitle) {
resourceLoader.loadResource(`${baseURL}templates/Category.xml.js`, function(resource) {
var doc = self.makeDocument(resource);
self.pushDocument(doc);
}, categoryTitle);
}
},
这对我有用。
最后一点:对于某些类别,我的标题是&符号,如'Tops & T-shirts'
。当然,我用一个XML实体替换了&符:'Tops & T-shirts'
。然而,这并不起作用,可能是因为该字符串被解码了两次:第一次将实体变为&符号,而在第二次传递时,单个&符号被标记为错误。对我有用的是:'Tops &amp; T-shirts'
!
答案 1 :(得分:4)
如果您使用atvjs,则很简单。
// create your dynamic page
ATV.Page.create({
name: 'homepage',
url: 'path/to/your/json/data',
template: function(data) {
// your dynamic template
return `<document>
<alertTemplate>
<title>${data.title}</title>
<description>${data.description}</description>
</alertTemplate>
</document>`;
}
});
// later in your app you can navigate to your page by calling
ATV.Navigation.navigate('homepage');
免责声明:我是atvjs的创建者和维护者。在撰写此答案时,它是使用TVML和TVJS进行Apple TV开发的唯一 JavaScript框架。因此,我只能从这个框架提供参考。答案不应该被误解为偏见。
答案 2 :(得分:3)
我正在使用PHP动态生成TVML文件,将输出配置为text / javascript格式:
<?php
header("Content-type: application/x-javascript");
[run your PHP API calls here]
$template = '<?xml version="1.0" encoding="UTF-8" ?>
<document>
... [use PHP variables here] ...
</document>';
echo "var Template = function() { return `". $template . "`}";
?>
答案 3 :(得分:1)
您可以通过创建代表TVML
模板中的xml的动态字符串来动态生成模板。
此文件包含的函数可用于创建可表示视图的XML
文档。
您可以使XMLHttpRequest
(例如:consuming API JSon calls through TVJS-tvOS)带回一些JSON数据,然后动态生成符合其中一个TVML模板的XML文档。将其解析为XML文档,然后导航到文档。