This is the TVML SearchTemplate (taken from Apple's Docs: https://developer.apple.com/library/prerelease/tvos/documentation/LanguagesUtilities/Conceptual/ATV_Template_Guide/SearchTemplate.html#//apple_ref/doc/uid/TP40015064-CH33-SW1
var Template = function() {
return `<?xml version="1.0" encoding="UTF-8" ?>
<document>
<head>
<style>
.suggestionListLayout {
margin: -150 0;
}
</style>
</head>
<searchTemplate id="tmpl_search">
<searchField/>
<collectionList>
<separator></separator>
</collectionList>
</searchTemplate>
</document>`
}
It's something very basic.
When the template is populated by some items it looks like the following
var Template = function() {
return `<?xml version="1.0" encoding="UTF-8" ?>
<document>
<head>
<style>
.suggestionListLayout {
margin: -150 0;
}
</style>
</head>
<searchTemplate>
<searchField/>
<collectionList>
<shelf>
<header>
<title>Shelf Title</title>
</header>
<section>
<lockup>
<img src="${this.BASEURL}resources/images/movies/movie_520_e1.lcr" width="350" height="520" />
<title>Title 1</title>
</lockup>
<lockup>
<img src="${this.BASEURL}resources/images/movies/movie_520_e2.lcr" width="350" height="520" />
<title>Title 2</title>
</lockup>
<lockup>
<img src="${this.BASEURL}resources/images/movies/movie_520_e3.lcr" width="350" height="520" />
<title>Title 3</title>
</lockup>
</section>
</shelf>
<grid>
<header>
<title>Grid Title</title>
</header>
<section>
<lockup>
<img src="${this.BASEURL}resources/images/music/music_520_e1.lcr" width="350" height="350" />
<title>Title 1</title>
</lockup>
<lockup>
<img src="${this.BASEURL}resources/images/music/music_520_e2.lcr" width="350" height="350" />
<title>Title 2</title>
</lockup>
<lockup>
<img src="${this.BASEURL}resources/images/music/music_520_e3.lcr" width="350" height="350" />
<title>Title 3</title>
</lockup>
</section>
</grid>
</collectionList>
</searchTemplate>
</document>`
}
Now, as soon as you name the template you should be able to get access to it in your Presenter code, that register events for the new Document:
resourceLoader.loadResource(templateURL, function(resource) {
if (resource) {
var doc = self.makeDocument(resource);
self.currentDOMDocument=doc
// DOM Document "onload" event
doc.addEventListener("load", self.dispatch.bind(self));
// DOM element "select" | "highlight" event
doc.addEventListener("select", self.load.bind(self));
doc.addEventListener("highlight", self.load.bind(self));
if (self[presentation] instanceof Function) {
self[presentation].call(self, doc, ele);
} else {
self.defaultPresenter.call(self, doc);
}
}
}
)
So, in this case the event should be a "select" event on the search field:
<searchField/>
and so you will be able to get the featured i.e. the keyboard and to attach events for the input like:
var formTemplate = ele.parentNode.parentNode; // your formTemplate button
var children = formTemplate.childNodes;
var textField = children.item(1); // replace "1" with the index of "textField" element in your template
var keyboard = textField.getFeature("Keyboard"); // get the textField's Keyboard element
and the input text
var userValue = keyboard.text.replace(/-/g,""); // the value entered by the user on the Apple TV keyboard
At the "load" event you can attach events to get input changes like:
var children = ele.childNodes;
var textField = children.item(1); // replace "1" with the index of "textField" element in your template
var keyboard = textField.getFeature("Keyboard"); // get the textField's Keyboard element
keyboard.onTextChange = function () {
console.log("onTextChange "+keyboard.text)
if( keyboard.text.length && !((keyboard.text.length+1) % 5) ) { // every 4 chars
keyboard.text+='-';
}
}
}
At this time you have the query string for your Search API.
As soon as you get a callback from your API (that could make use of sayts - Search As You Type),
we need to dynamically add items to the search results as new
<shelf/>
and inside a list of
<section><lockup/></section>
lockup items. So how to dynamically add now these elements?