【问题标题】:jsViews - re-evaluate 'if' tag on root property changejsViews - 在根属性更改时重新评估“if”标签
【发布时间】:2015-05-07 10:30:29
【问题描述】:

我使用 jsViews 创建了一个表格/网格。每行都有一个编辑按钮,单击该按钮会选择该行并显示输入控件而不是文本值。

如果我使用 data-link="visible{:#parent.parent.data.selectedIndex!==#index}" 显示/隐藏输入,那么它工作正常。

但是,我尝试了一种不同的方法,使用 {^{if #parent.parent.data.selectedIndex===#index}}...{{else}}...{{/if}} 来显示/隐藏输入,当我的数据对象上的 selectedIndex 发生更改时,这不起作用。

我也尝试过使用{^{if ~root.selectedIndex===#index}},但这也没有用。 {{if}} 可以做到这一点吗?我之所以在第一种可行的方法上进行尝试,是为了避免渲染大量无论如何都会被隐藏的选择框。

我的数据对象如下所示:

app = {
    data: [...],

    selectedIndex: null,

    select: function select(index) {
        if (this.selectedIndex !== index) {
            $.observable(this).setProperty("selectedIndex", index);
        }
    }
};

我这样链接模板:

$.templates("#myTemplate").link("#divHolder", app)
    .on("click", ".data .editButton", function() {
        app.select($.view(this).index);
    })
    .on("click", ".data .saveButton", function() {
        // save details
    })
    .on("click", ".transmittals .cancelButton", function() {
        // reset values

        app.select(null);
    });

我的模板是这样的:

<script id="myTemplate" type="text/x-jsrender">
    <table id="tblData" class="data">
        <thead>
            <tr>
                <th></th>
                <th>A</th>
                <th>B</th>
                <th>C</th>                    
            </tr>
        </thead>
        <tbody>
            {^{for data}}
            <tr class="item">
                <td>
                    {{if #parent.parent.data.selectedIndex===#index}}
            <span class="editItem">
                <button class="cancelButton">Cancel</button></span>
                    {{else}}
            <span class="viewItem">
                <button class="editButton">Edit</button></span>
                    {{/if}}                
                </td>
                <td>
                    {^{if #parent.parent.data.selectedIndex===#index}}
            <span class="editItem"><input type="text" data-link="B" /></span>
                    {{else}}
            <span class="viewItem" data-link="B"></span>
                    {{/if}}
                </td>
                <td>
                    {^{if #parent.parent.data.selectedIndex===#index}}
            <span class="editItem"><input type="text" data-link="C" /></span>
                    {{else}}
            <span class="viewItem" data-link="C"></span>
                    {{/if}}
                </td>
            </tr>
        {{/for}}
        </tbody>
    </table>
</script>

【问题讨论】:

    标签: javascript jquery jsviews


    【解决方案1】:

    当您添加 {{if}} 块时,它是一个嵌套视图,因此单击按钮不会让您获得带有索引的项目视图。您需要使用$.view(this).parent.index - 或者更简单的$.view(this).getIndex() - 它会自动通过嵌套视图(如果有)进入项目视图并获取其索引。

    app.select($.view(this).getIndex());
    

    (请参阅此处的讨论:https://github.com/BorisMoore/jsrender/issues/173#issuecomment-11058106

    顺便说一句,这里是您的示例的修改形式,只是为了给您一些想法。它使用&lt;button data-link="{on ~root.select #getIndex()}"&gt;Edit&lt;/button&gt; 连接按钮上的点击处理程序,并直接调用 select 方法,将索引传递给它:

    <script id="myTemplate" type="text/x-jsrender">
    <table id="tblData" class="data">
        <thead>
            ...
        </thead>
        <tbody>
        {^{for data}}
            <tr class="item">
            {^{if ~root.selectedIndex===#index}}
                <td><button class="cancelButton" data-link="{on ~root.select null}">Cancel</button></td>
                <td><input data-link="A" /></td>
                <td><input data-link="B" /></td>
            {{else}}
                <td><button class="editButton" data-link="{on ~root.select #getIndex()}">Edit</button></td>
                <td data-link="A"></td>
                <td data-link="B"></td>
            {{/if}}
            </tr>
        {{/for}}
        </tbody>
    </table>
    </script>
    
    <div id="divHolder"></div>
    
    <script>
    var app = {
        data: [{A:"aa", B: "bb"},{A:"aa2", B: "bb2"}],
        selectedIndex: null,
        select: function(index) {
            if (this.selectedIndex !== index) {
                $.observable(this).setProperty("selectedIndex", index);
            }
        }
    };
    
    $.templates("#myTemplate").link("#divHolder", app);
    </script>
    

    【讨论】:

    • 感谢您的解释和建议。它现在运行良好。
    猜你喜欢
    • 1970-01-01
    • 2023-03-31
    • 2016-03-02
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-01-14
    • 1970-01-01
    • 2020-07-28
    相关资源
    最近更新 更多