我已经看到了这个问题(Force view to reload tvml content on Apple TV/tvos),答案描述了如何从DOM中删除内容,但有没有办法添加它们?
我知道NodeList上的标准appendChild,但是如何创建要追加的正确元素?也就是说,当您在TVML中创建文档时,它是一种特殊的XML语法,然后将其解析为文档。有没有办法解析文档的一部分,以便您可以将其添加到架子中,比如在文档出现后动态地向行中添加更多项目?
P.S。我已经尝试将Presenter.parser.parseFromString()与新项目的xml一起使用,但它正在抛出具有该语法的IKDOMException。
答案 0 :(得分:5)
您可以采取许多方法来动态添加项目。需要注意的一点是,Apple的示例代码并非针对动态数据进行了很好的构建。
创建模板后,您可以通过多种方式更改文档。创建模板后,您应该拥有该文档的所有权。在以下示例中,变量 doc 包含我要操作的堆栈模板文档。
var shelves = doc.getElementsByTagName("shelf"); //get all the shelves
var shelfToAddTo = shelves.item(0); //choose the index for the shelf you want to add to.
var sectionToAdd = `<section>
<lockup>
<img src="pathToImg" width="100" height="100"/>
<title>Title Goes Here</title>
</lockup>
</section>`;
shelfToAddTo.insertAdjacentHTML('beforeend', sectionToAdd); //this will add the new section before the </shelf> tag.
这会在文档的第一个工具栏中添加一个新部分和锁定。
答案 1 :(得分:-1)
<强>更新强>
您可以使用DataItem API来管理原型数据。
您无法将JSON对象直接绑定到模板,您必须将它们转换为DataItem对象。检索所需的节元素并为节创建新的数据项。从JSON对象创建新数据项。 setPropertyPath方法用于将新数据项绑定到节数据项。清单5-4显示了一个修改过的parseJson函数,该函数从Images.json文件中获取信息,将它们转换为数据项,并将它们绑定到相应的部分。
使用prototype元素,您可以创建包含类似对象的单个锁定。在锁定内部,您可以定义锁定的结构。清单5-5显示了一个锁定,它显示了在type元素中定义为artwork的对象。每个图像的URL和标题都是从JSON对象中提取的。
<prototypes>
<lockup prototype="artwork">
<img binding="@src:{url};" width="200" height="300"/>
<title binding="textContent:{title};" />
</lockup>
</prototypes>
<section binding="items:{images};" />
以下使用items
中的section
对您的原型代码进行迭代和填充:
function parseJson(information) {
var results = JSON.parse(information);
let parsedTemplate = templateDocument()
navigationDocument.pushDocument(parsedTemplate)
let shelf = parsedTemplate.getElementsByTagName("shelf").item(0)
let section = shelf.getElementsByTagName("section").item(0)
//create an empty data item for the section
section.dataItem = new DataItem()
//create data items from objects
let newItems = results.map((result) => {
let objectItem = new DataItem(result.type, result.ID);
objectItem.url = result.url;
objectItem.title = result.title;
return objectItem;
});
//add the data items to the section's data item; 'images' relates to the binding name in the protoype where items:{images} is all of the newItems being added to the sections' data item;
section.dataItem.setPropertyPath("images", newItems)
}
模板:
<document>
<stackTemplate>
<banner>
<title>JSON Shelf</title>
</banner>
<collectionList>
<shelf>
<prototypes>
<lockup prototype="artwork">
<img binding="@src:{url};" width="200" height="300"/>
<title binding="textContent:{title};" />
</lockup>
</prototypes>
<section binding="items:{images};" />
</shelf>
</collectionList>
</stackTemplate>
</document>
参考:
希望它对你有所帮助。