10

有谁知道如何使用 TVJS/TVML 在 Apple tv 应用程序中动态生成模板?基本上我想访问我的 API,取回一个对象数组,然后将该数据插入到我的 XML 模板中。

我一直在寻找有关如何完成它的信息,但没有找到。我发现许多使用硬编码图像、视频等的教程,但没有动态生成。

任何帮助,将不胜感激。

4

4 回答 4

6

最后,我想通了。即时生成模板并不难,但我想重用 Presenter 和 ResourceLoader,并将模板作为 *.xml.js 文件。这是我设法得出的解决方案。

对于初始视图,我使用了catalogTemplate,如Ray Wenderlich 的教程中所示。然而,我没有在会议上发表演讲,而是展示了男士和女士商品的类别。一旦选择了一个类别,我想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,我传递categoryTitleresourceLoader

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 &amp; T-shirts'. 然而,这并没有奏效,可能是因为这个字符串被解码了两次:第一次将实体转换为 & 符号,而在第二次通过时,单个 & 符号被标记为错误。对我有用的是:'Tops &amp;amp; T-shirts'

于 2015-10-09T17:06:45.147 回答
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 框架。因此我只能从这个框架中提供参考。答案不应被误认为是有偏见的意见。

于 2016-01-26T06:44:05.510 回答
3

我正在使用 PHP 动态生成 TVML 文件,将输出配置为文本/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 . "`}";
?>
于 2015-09-28T00:21:56.407 回答
1

您可以通过创建表示模板中的 xml 的动态字符串来动态生成TVML模板。

查看此处的代码:https ://developer.apple.com/library/prerelease/tvos/samplecode/TVMLCatalog/Listings/client_js_Presenter_js.html#//apple_ref/doc/uid/TP40016505-client_js_Presenter_js-DontLinkElementID_6

该文件具有可用于创建XML可表示视图的文档的功能。

您可以进行XMLHttpRequest(例如:通过 TVJS-tvOS 使用 API JSon 调用)带回一些 JSON 数据,然后动态生成符合 TVML 模板之一的 XML 文档。将其解析为 XML 文档,然后导航到该文档。

于 2015-09-28T00:06:35.207 回答