Проверка длины jsViews возвращает ошибку

Я использую jSViews и получаю данные через JSON, а затем связываюсь с шаблоном.

Шаблон показывает данные, которые я отправляю, однако у меня есть простой шаблон сообщения с массивом комментариев.

Если я попытаюсь проверить, что длина массива больше 0, используя lenth, произойдет сбой:

0x800a138f — ошибка выполнения JavaScript: невозможно получить свойство «длина» неопределенной или нулевой ссылки

вот фрагмент кода:

$.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>

I can hack it using a helper:

{^{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);

однако я не могу понять, почему это дает мне эту ошибку в идеале, я просто хочу включить шаблон комментариев, ЕСЛИ есть комментарии, и не нужно использовать, если вообще, но это единственный способ заставить его работать


person grayson    schedule 30.03.2017    source источник


Ответы (1)


Если post_detail не имеет свойства комментариев, то {^{if comments.length}} действительно выдаст ошибку. Если вы включите «нулевую проверку», она должна работать:

{^{if comments && comments.length > 0}}...{{/if}}
person BorisMoore    schedule 30.03.2017
comment
Спасибо за ответ, однако у него есть свойство комментариев, когда я обновляю его с помощью наблюдаемого, и он все равно выдает ту же ошибку. Кроме того, если я изменю код в ответе ajax, чтобы связать его с первым элементом, то есть $.templates(#post-detail-template).link(.single-post-detail .row, post_data[0]), он все еще имеет проблема, и я намеренно заставляю свой ответ json возвращать пустой массив для комментариев ко всем сообщениям, если комментариев нет; - person grayson; 31.03.2017