【问题标题】:jQuery: template from string questionjQuery:来自字符串问题的模板
【发布时间】:2011-02-14 13:52:19
【问题描述】:

假设我有一个这样的视图模型

var viewModel = {
    "Dtos": [{
        "Id": 1,
        "Number": 100,
        "Description": "some description",
        "Total": 200},
    {
        "Id": 2,
        "Number": 200,
        "Description": "some description",
        "Total": 400}]
};

viewModel.EditUrl = "http://someUrl.com?Id=${Id}";

如何在以下模板中呈现 EditUrl,以便包含模板将其作为模板处理;换句话说,如何将视图模型中的字符串转换为模板中的模板。

<script id="rowTemplate" type="text/x-jquery-tmpl">
    <tr>
        <td><a href="${EditUrl}">Edit</a></td>
            <td>${Id}</td>
    </tr>
</script>

Knockout.js 负责绑定 this,因此 Id 可以正确呈现。

【问题讨论】:

    标签: jquery jquery-templates


    【解决方案1】:

    如何让 viewModel.EditUrl 像这样的函数:

    viewModel.EditUrl = function(id) { return "http://someUrl.com?Id=" + id; }
    

    然后,您的模板将如下所示:

    <script id="rowTemplate" type="text/x-jquery-tmpl">
        <tr>
            <td><a href="${viewModel.EditUrl(Id)}">Edit</a></td>
                <td>${Id}</td>
        </tr>
    </script>
    

    点赞:http://jsfiddle.net/rniemeyer/CegbS/

    否则,由于您使用的是淘汰赛,您可以考虑将 EditUrl 设置为数组中每个项目的dependentObservable。然后,您实际上可以只绑定到 EditUrl。与上面几乎相同,只是函数将位于数组中的每个项目上。让我知道,我也可以给你看一个例子。

    【讨论】:

    • @RP Niemeyer:很酷,函数可以工作,但我更喜欢使用 observable。你也可以发布那个例子吗?
    • 会类似于:jsfiddle.net/rniemeyer/KmVkA。将 Dtos 项的创建移至函数,只是因为当您开始在每个项上定义dependentObservables 或其他函数时,它有助于简化 viewModel 定义中的对象创建。
    • @RP Niewmeyer:我接受了你的回答,但这并不是我所需要的。看,我的 viewModel 来自服务器的 JSON,我将映射插件应用到它。我宁愿不必在客户端上做任何额外的 js 功能。我想说 EditUrl 只是模板知道如何渲染的视图模型上的一个成员。在服务器端 viewModel 只是一个动态类型,用户可以使用上面的语法输入 url。如果我开始引入 javascript 语法,它将不起作用:)
    • 你能让你的服务器端返回一个已经正确格式化的 EditUrl 属性吗?否则,映射插件有一些钩子来自定义对象创建。如果 EditUrldependentObservable 是由映射插件创建的,它对你有用吗?告诉我,我也可以试试这个例子。
    • @RP Niemeyer:这是一个更现实的小提琴jsfiddle.net/epitka/HuNqP/3 所有的标记都来自服务器并且是动态生成的。我可以预先计算 url,但这意味着我必须为每个项目(dto)传递它,而不仅仅是 url,它基本上是一个模板。那有意义吗? jsfiddle.net/epitka/HuNqP/3
    猜你喜欢
    • 1970-01-01
    • 2014-07-26
    • 2012-11-13
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-01-02
    • 1970-01-01
    • 2013-07-05
    相关资源
    最近更新 更多