jsView - 如何使用props作为数据呈现自定义标记的内容?

时间:2013-04-25 07:14:45

标签: jsviews

我有自定义标记,可以将自己作为内部标记,我想将其props绑定为data。我可以更改第一个test代码title属性并查看更改但不能对内部test代码执行此操作。我认为这是因为this.tagCtx.content.render()的错误论点。以下是示例:

<!DOCTYPE html>
<html>
<head>
<script src="js/jquery-1.9.1.min.js" type="text/javascript"></script>
<script src="js/jsrender.js" type="text/javascript"></script>
<script src="js/jquery.observable.js" type="text/javascript"></script>
<script src="js/jquery.views.js" type="text/javascript"></script>

<script id="testTemplate" type="text/x-jsrender">
    <div>{^{>title}}{^{:content}}</div>
</script>

<script id="myTemplate" type="text/x-jsrender">
    {^{test title='Test1'}}
        {^{test title='Test2'}}
        {{/test}}
    {{/test}}
</script>

<script type="text/javascript">
    $.views.tags({
        test: {
            render: function(){
                this.tagCtx.props.content = this.tagCtx.content.render();
                return this.template.render(this.tagCtx.props, this.tagCtx, this.tagCtx.view);
            },

            template: "#testTemplate"
        }
    });

    $.templates({myTemplate: "#myTemplate"});

    $(function () {
        $.link.myTemplate('#container', {});

        $('#editTitle').click(function () {
            $.observable($.view('#container div:first div').data).setProperty('title', prompt());
        });
    });
</script>
</head>
<body>
    <span id="editTitle">EditTitle</span>
    <div id="container"></div>
</body>
</html>

1 个答案:

答案 0 :(得分:1)

这里的问题是内部标记被呈现为字符串,而不是数据链接标记,因为this.tagCtx.content.render()调用只是在与块内容相对应的编译模板上调用render方法。

如果您想要呈现为数据链接标记,则需要调用this.tagCtx.render()

此外,在调用this.tagCtx.render()时,您需要标记来呈现其内容,而不是另一个模板。设置template: "#testTemplate"会导致代码使用该模板而不是内容。所以你需要的是这些方面:

var template = $.templates("#testTemplate"); 

$.views.tags({
    test: {
    render: function() {
            var tagCtx = this.tagCtx;
            tagCtx.props.content = tagCtx.render();
            return template.render(tagCtx.props, undefined, tagCtx.view);
        }
    }
});

您可能不希望在template.render(...)调用中将tagCtx作为上下文传递。您可以传入tagCtx.ctx,或者只是未定义...