【问题标题】:How can I update underlying JSViews data from onclick event如何从 onclick 事件更新底层 JSViews 数据
【发布时间】:2014-03-30 18:34:31
【问题描述】:

我有一个由 JSViews 模板生成的照片库,带有一个赞成和反对按钮。 OnClick 触发数据库更新以增加基础分数。我还需要增加页面中呈现的 HTML 中的 Score 字段,使其与数据库中的新值保持一致。

下面的代码是我的第一次尝试,但它不起作用。我怎样才能做到这一点?

     <script type="text/x-jsrender" id="gallerycat1">
    {{for List}}
    <ul>
        <li data-type="media" data-url="{{:MainImage}}"></li>
        <li data-thumbnail-path="{{:Thumbnail}}"></li>
        <li data-thumbnail-text>
            <p  data-link="Score"  class="largeLabel"><span id="span-a-{{:ProfileId}}">{{:Score}}</span> {{:FirstName}} {{:LastName}}, {{:Company}}</p>

            <p class="smallLabel">Click to vote.</p>
        </li>
        <li data-info="">
            <div class="voting-buttons">
                <a href="#" data-link="Score" onclick="upVote('<%= userVoted%>',{{:[ImageId]}},1);">
                    <img width="30" src="/client/images_webdev/buttons/heart.png" alt="Upvote this" />
                </a>
                <a href="#"  data-link="Score"  onclick="downVote('<%= userVoted%>',{{:[ImageId]}},0);">
                    <img data-link="Score" width="30" src="/client/images_webdev/buttons/thumbs.png" alt="Downvote this" />
                </a>

            </div>
            <p class="mediaDescriptionHeader"><span data-link="Score" id="scorem">{^{:Score}}</span> {{:FirstName}} {{:LastName}}, {{:Company}}</p>
        </li>
    </ul>
    {{/for}}
</script>

这是用于投票的 onClick 事件

function castVote(userVoted, imageId, vote) {
    jQuery.ajax({
        url: '/client/webservice/voting.asmx/InsertVote',
        type: "POST",
        data: "{'userVoted':'" + userVoted + "','imageId':" + imageId + ",'vote':" + vote + "}",
        contentType: "application/json; charset=utf-8",
        dataType: "json",
        success: function(response) {
            if (response.d == 'True') {
                var counter = jQuery('#scorem').text();
                if (vote > 0) {
                    counter++;
                } else {
                    counter--;
                }
                jQuery('#scorem').text(counter);
                upVoteConfirm();
            } else {
                downVoteConfirm();
            }
        }
    });

【问题讨论】:

    标签: javascript jquery ajax jsrender jsviews


    【解决方案1】:

    我假设您使用的是 JsViews,而不仅仅是 JsRender。你是调用链接方法,还是只调用渲染方法?除非您实际使用 JsViews 链接方法进行数据链接,否则您上面的数据链接表达式将不起作用。

    如果您要进行数据链接,则需要调用$.observable(listItem).setProperty("Score", listItem.Score+1); - 这将自动更新&lt;span data-link="Score"&gt;&lt;/span&gt; 等数据链接表达式或{^{:Score}} 等数据链接标签。

    参见例如http://www.jsviews.com/#jsvplaying,其中有两个示例具有“更改”按钮来修改名称属性。

    【讨论】:

    • 感谢鲍里斯的评论。我正在使用 JSViews 并使用链接方法:template.link("#tmplTopRated", data1);然而,更新价值并不快乐。我得到 Uncaught ReferenceError: listItem is not defined...
    • 您正在执行 {{for List}},因此您正在迭代某些项目并希望点击代码增加“当前列表项”的 Score 属性。所以你需要得到那个项目。一种方法是编写: var listItem = $.view(this).data;更详细地查看示例,以及相关的文档和描述性文本。您将看到在那里如何实现类似的场景。 (在我指向的示例中,我看到了这一行:var dataItem = $.view(this).data;...)
    • 事实上,您需要了解数据绑定和视图如何在 JsViews 中工作的基础知识。一个好的计划是转到示例并使用“尝试”选项卡修改示例 - 然后选择“运行”按钮。或者从“完整代码”选项卡中复制示例代码,并将其作为探索您自己场景的起点。
    • 顺便说一句,您在多个地方使用数据链接的方式与其他标记冲突。数据链接元素将用链接表达式的值替换元素内容。所以

      other content

      将替换“其他内容”。 {^{:Score}} 冗余地使用链接元素(这将删除内容)和链接标签作为内容。您可以选择其中一个...再次,请参阅示例...
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-10-31
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多