如何为 jsviews 创建自定义属性处理程序?

How create custom attribute handler for jsviews?

我想用JsViews播放html5视频内容,像这样:

html:

<div id="result"></div>
<script id="myTmpl" type="text/x-jsrender">
    <video autobuffer controls data-link="muted{:muted}">
        <source id="mp4" data-link="src{:src}" type="video/mp4">
    </video>
    <button id="muted">change muted</button>
</script>

js:

var data = {
    src: "http://grochtdreis.de/fuer-jsfiddle/video/sintel_trailer-480.mp4",
    muted: true
};

var myTmpl = $.templates("#myTmpl");

myTmpl.link("#result", data);

$("#result").on("click", "#muted", function () {
    $.observable(data).setProperty("muted", !data.muted);
});

example on jsfidle

可以看出属性 muted 默认处理,看起来像 muted=truemuted=false,但在 HTML specifications - attribute "muted" may or may not be. That is, to should behave as an attribute of a disable here: Data-linking the disabled and title attributes.

也许有一些方法可以自定义(替换)jsviews 中的标准 html 属性处理程序?

mutedfalse 时,您可以删除 muted 属性,方法是:

<video autobuffer controls data-link="muted{:muted||null}">

然而,这不会让事情如您所愿,因为动态删除或添加静音属性实际上不会 mute/unmute 视频控件。为此,您需要将静音元素上的静音 属性 设置为 true/false.

此外,当用户单击视频元素 UI 上的内置静音控件时,您希望它能够明显地修改您的 muted 数据 属性。所有这些都可以使用以下代码工作:

var video = $("video");

$.observe(data, "muted", function(ev, eventArgs) {
    video[0].muted = eventArgs.value;
})

video.on("volumechange", function() {
    $.observable(data).setProperty("muted", video[0].muted);
});

这是您的 jsfiddle 的更新版本,其中包含更改:http://jsfiddle.net/ck9sr49L/3/

我打算在下一个 JsViews 中添加一个新功能,以便能够选择数据-link 到 HTML 元素上的 属性,而不是相应的属性。语法将是 data-link="prop-muted{:...}"(类似于 data-linking 到 CSS 属性 data-link="css-muted{:...}")。通过该更新,您将能够简化事情并编写以下内容:

模板:

<video autobuffer controls data-link="prop-muted{:muted}">
    <source id="mp4" data-link="src{:src}" type="video/mp4"/>
</video>
<label>Muted: <input type="checkbox" data-link="muted"/></label>

代码:

var data = {
    src: "http://grochtdreis.de/fuer-jsfiddle/video/sintel_trailer-480.mp4",
    muted: true
};

var myTmpl = $.templates("#theTmpl");

myTmpl.link("#result", data);

$("video").on("volumechange", function(ev) {
    $.observable(data).setProperty("muted", ev.target.muted);
});