首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >TVML/TVJS中的动态XML模板

TVML/TVJS中的动态XML模板
EN

Stack Overflow用户
提问于 2015-09-28 00:03:57
回答 4查看 4.5K关注 0票数 10

有人知道如何使用TVJS/TVML在苹果电视应用程序中动态生成模板吗?基本上,我想输入我的API,得到一个对象数组,然后将数据插入到XML模板中。

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

任何帮助都将不胜感激。

EN

回答 4

Stack Overflow用户

发布于 2015-10-10 01:06:45

最终,我弄清楚了这一点。动态生成模板并不困难,但我希望重用Presenter和ResourceLoader,并将模板作为*.xml.js文件。这是我设法得到的解决方案。

对于初始视图,我使用了一个catalogTemplate,如Ray Wenderlich's tutorial中所示。然而,我展示的不是会议演讲,而是男人和女人的商品类别。一旦选择了一个类别,我想要显示一个包含该类别的多个选项的stackTemplate。问题是如何将任何信息传递给第二个模板,在最简单的情况下是类别的标题。

在第一个模板中,我将锁定配置如下:

代码语言:javascript
运行
复制
<lockup categoryTitle="Women: Dresses" categoryDir="w-dresses">
  <img src="${this.BASEURL}images/dresses.jpg" width="230" height="288" />
  <title>Dresses</title>
</lockup>

application.js中,我附加了一个侦听器,与教程显示的方式相同:

代码语言:javascript
运行
复制
doc.addEventListener("select", Presenter.load.bind(Presenter));

下面是第二个模板(Category.xml.js):

代码语言:javascript
运行
复制
var Template = function(categoryTitle) { 
    return `<?xml version="1.0" encoding="UTF-8" ?>
    <document>
      <stackTemplate>
        <banner>
          <title>${categoryTitle}</title>
        </banner>
      </stackTemplate>
    </document>`
}

这是一个JavaScript,所以在您的例子中,您可以将一个值数组传递给函数,然后相应地构造模板。棘手的部分是传递一个值。

首先,我对ResourceLoader做了一些更改(当然,这可以做得更好,这只是一个概念证明)。在调用Template时,我只是将categoryTitle作为附加参数添加到顶级函数中

代码语言:javascript
运行
复制
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

代码语言:javascript
运行
复制
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'

票数 6
EN

Stack Overflow用户

发布于 2016-01-26 14:44:06

如果你使用的是atvjs,这很简单。

代码语言:javascript
运行
复制
// 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');

免责声明:我是的创建者和维护者,在撰写本文时,它是可用于使用TVML和TVJS进行苹果电视开发的唯一的 JavaScript框架。因此,我只能从这个框架中提供参考。答案不应该被误认为是有偏见的观点。

票数 4
EN

Stack Overflow用户

发布于 2015-09-28 08:21:56

我使用PHP动态生成TVML文件,将输出配置为text/javascript格式:

代码语言: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
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/32809936

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档