2014-10-15 2 views
0

Как вы можете видеть в заголовке сообщения, я пытаюсь использовать условный блок с условием длины наблюдаемогоArray. К сожалению, он не работает (на самом деле, когда я проверяю величину наблюдаемогоArray всегда, он всегда показывает 0), а ошибка говорит:
Uncaught ReferenceError: не удается обработать привязку "if: function() {return usersets(). Length === 0}" Сообщение: usersets не определен.
Вот разметка:Ошибка при использовании условного блока Knockout.js с наблюдаемой длиной объекта

<div data-bind="foreach: usersets" id="user_sets"> 
      <!-- ko if: usersets().length === 0 --> 
      <p id="noSets">Пока у вас нет личных комплектов. Напишите стилисту или просто добавьте подходящий комплект в избранное</p> 
      <!-- /ko --> 
      <div class="block"> 
       <input type="hidden" data-bind="value: $data.SetId" /> 
       <div class="fav" data-bind="css: { fullop: $data.IsFavorite == true }"> 
        <img alt="" src="img/fav.png" data-bind="click: $root.setFavorite"> 
       </div> 
       <div> 
        <img alt="" data-bind="attr: { src: $data.SetImg }"> 
       </div> 
       <div class="txt"> 
        <h3 data-bind="text: $data.SetName, click: $root.go"></h3> 
        <p><span data-bind="text: $data.ItemsNumber + ' вещей,'"></span><span data-bind=" text: ' общая цена ' + $data.SetPrice + ' руб'"></span></p> 
       </div> 
      </div> 
     </div> 

И это HWI ViewModel выглядит:

<script> 
     function SetsViewModel() { 
      var self = this; 
      self.usersets = ko.observableArray(); 
      self.setFavorite = function (data) { 
       if (data.IsFavorite == true) { 
        action = "DELETE"; 
        $.ajax({ 
         type: action, 
         dataType: "json", 
         contentType: 'application/json; charset=utf-8', 
         url: "/api/setlikes/" + data.SetId + "/" + $("#MainContent_guid").val(), 
         data: {}, 
         success: function() { 
          window.location.reload(); 
         }, 
         error: function (xhr, status, error) { 
          var err = eval("(" + xhr.responseText + ")"); 
          alert(err.Message); 
         } 
        }); 
       } 
       if (data.IsFavorite == false) { 
        var j = '{"UserID":"' + $("#MainContent_guid").val() + '", "SetID":"' + data.SetId + '", "IsFavorite": true}'; 
        $.ajax({ 
         type: "POST", 
         dataType: "json", 
         contentType: 'application/json; charset=utf-8', 
         url: "/api/setlikes", 
         data: j, 
         success: function (data) { 
          window.location.reload(); 
         }, 
         error: function (xhr, status, error) { 
          var err = eval("(" + xhr.responseText + ")"); 
          alert(err.Message); 
         } 
        }); 
       } 
      } 
      self.go = function (data) { 
       window.location.replace("http://www.prepp.me/set/" + data.SetId); 
      } 
      $.getJSON("/api/sets?username=" + $("#MainContent_guid").val(), self.usersets); 
     } 

ответ

1

Вы пытаетесь получить доступ к usersets в поиске по usersets, потому что в цикле Еогеасп, то scope - текущий элемент usersets.

Попробуйте

<!-- ko if: $root.usersets().length === 0 --> 
//or 
<!-- ko if: $parent.usersets().length === 0 --> 
+0

Да, спасибо, это работает. Можно ли использовать условный блок снаружи foreach? –

+0

Да, конечно. Условное «if:» можно использовать в любом месте страницы. Убедитесь, что вы выполняете область действия, $ root - это модель, вы можете определить область действия с помощью инструкции «with:», «Knockout doc» довольно четко оглашает. – Yoann

Смежные вопросы