【问题标题】:jsViews checking length returns errorjsViews检查长度返回错误
【发布时间】:2017-03-30 21:23:03
【问题描述】:

我正在使用 jSViews 并通过 JSON 获取数据,然后链接到模板。

模板显示了我发送的数据,但是我有一个简单的帖子模板,其中包含一个 cmets 数组。

如果我尝试检查数组的长度是否大于 0,使用 lenth,它会崩溃:

0x800a138f - JavaScript 运行时错误:无法获取未定义或空引用的属性“长度”

这是一个sn-p的代码:

$.getJSON("/students/dashboard/GetDashboardPosts")
.done(function (json) {
    posts_data = json;

    if (posts_data) {
       if (posts_data.length > 0) {                      
            var posts_html = $("#posts-template").render(posts_data);
            $(".posts .row").html(posts_html);

            $.templates("#post-detail-template").link(".single-post-detail .row", post_detail); // post_detail is initially an empty object
        }

    }

$(".post").on("click", "#posts-section", function (event) {
    // get the index of the clicked item - should be able to do this with $.view but it isnt working - check it out.
    var idx = $(this).closest(".dashboard-post").attr("data-index");

    // update it observably so we dont have to traverse the DOM.
    $.observable(post_detail).setProperty(
        (posts_data[idx])
    );
    $("body").addClass("has-overlay");
    $(".single-post-detail").addClass("expanded");

});


script id="post-detail-template" type="text/x-jsrender">
<div class="col s12 m12 l6 post">
    ...
    ...
            {^{if comments.length > 0}}
                {^{include comments tmpl="#post-detail-comments-template"/}}:
            {{/if}}
        </div>
</script>

script id="post-detail-comments-template" type="text/x-jsrender">
<section class="comments-section">
    <ul class="comments-list">
        {^{for #data}}
        <li class="comment-item">
           ...
        </li>
        {{/for}}
    </ul>
</section>

我可以使用助手破解它:

{^{if ~hasLength(comments)}}
                {^{include comments tmpl="#post-detail-comments-template"/}}:
 {{/if}}

var viewHelpers = {
    hasLength: function (arr) {
        if (!arr) { return false; }

        var x = arr;
        if (x.length > 0) {
            return true;
        }
        return false;

    }
};

$.views.helpers(viewHelpers);

但是我不明白为什么理想情况下它会给我这个错误,我只想包含 cmets 模板,如果有 cmets 并且根本不必使用 if,但这是我能得到它的唯一方法工作

【问题讨论】:

    标签: javascript jsrender jsviews


    【解决方案1】:

    如果 post_detail 没有 cmets 属性,那么{^{if comments.length}} 确实会产生错误。如果您包含“空检查”,它应该可以工作:

    {^{if comments && comments.length > 0}}...{{/if}}
    

    【讨论】:

    • 感谢您的回复,但是当我用 observable 更新它时它确实有一个 cmets 属性,它仍然给我同样的错误。此外,如果我更改 ajax 响应中的代码以将其链接到第一项,即 $.templates("#post-detail-template").link(".single-post-detail .row", post_data[0])它仍然存在问题,如果没有 cmets,我故意让我的 json 响应为所有帖子的 cmets 返回一个空数组;
    猜你喜欢
    • 2020-05-25
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-09-24
    • 2015-07-25
    相关资源
    最近更新 更多