2016-05-26 3 views
0

У меня есть этот код, который я ожидал, чтобы сделать меню, которое запрошенные из REST:Невозможно отобразить observableArray

 var PageViewModel = function() { 
      var self = this; 
//     self.menus = [ 
//      { name: 'Foor', slug: 'foo'}, 
//      { name: 'Bar', slug: 'bar'}, 
//      { name: 'Fam', slug: 'fam' } 
//     ]; 
      self.menus = ko.observableArray(); 
      var result = query.find({ 
       success: function(results) { 
        console.log("Successfully retrieved " + results.length + " menus."); 
        var menus = []; 
        for (var i = 0; i < results.length; i++) { 
         var object = results[i]; 
         console.log(JSON.stringify(object)); 
         menus.push(object); 
        } 
        self.menus(menus); 
       }, 
       error: function(error) { 
        console.log("Error: " + error.code + " " + error.message); 
       } 
      }); 
      console.log('Menus = ' + JSON.stringify(self.menus)); 
      this.transitionTo = function(slug) { 
       window.location.href = slug + ".html"; 
      } 
     } 

HTML:

<ul class="uk-text-center" data-bind="foreach: menus()"> 
    <li class=""> 
     <button class="button button-white uk-margin-bottom"><span data-bind="text: name">Foo</span></button> 
    </li> 
</ul> 

Проблема в том, что меню визуализации список, но имена пустые. Однако, если я просто позволю коду использовать статический массив, он отлично работает. С этим я пытался отладить с Chrome и от того, что я вижу что-то может отсутствовать:

enter image description here

Что может быть не так?

+0

Не могли бы вы выставить немного больше HTML? А также есть ли что-нибудь в консольном выпуске? Возможно, вам придется использовать 'foreach: menus()', но вам нужно больше деталей благодаря – brianlmerritt

+0

Я добавил код HTML. Кроме того, если я изменил код на 'foreach: menus()' ошибка: 'Message: menus не является функцией' – xybrek

+0

У вас есть' Parse.Object 'в массиве' results', который не имеет свойств, поэтому вам нужно преобразовать их в JSON, прежде чем переходить в Knockout 'menus.push (object.toJSON());' – nemesv

ответ

1

Пробудите следующий путь.

См. foreach-binding для получения дополнительной информации об использовании.

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

var PageViewModel = function() 
 
{ 
 
      var self = this; 
 
    
 
      self.menus = ko.observableArray([]); 
 
      var result = query.find(
 
       { 
 
       success: function(results) 
 
       { 
 
        console.log("Successfully retrieved " + results.length + " menus."); 
 
        var menus = []; 
 
        
 
        for (var i in results) 
 
        { 
 
         var object = results[i]; 
 
         
 
         menus.push(object.toJSON()); 
 
        } 
 
        self.menus(menus); 
 
       }, 
 
       error: function(error) { 
 
        console.log("Error: " + error.code + " " + error.message); 
 
       } 
 
      }); 
 
      
 
      this.transitionTo = function(slug) { 
 
       window.location.href = slug + ".html"; 
 
      } 
 
     } 
 

 
ko.applyBindings(new PageViewModel());
<script src="https://ajax.googleapis.com/ajax/libs/jquery/2.1.1/jquery.min.js"></script> 
 
<script src="https://cdnjs.cloudflare.com/ajax/libs/knockout/3.2.0/knockout-min.js"></script> 
 
<div> 
 
    <ul class="uk-text-center" data-bind="foreach: menus"> 
 
    <li class=""> 
 
     <button class="button button-white uk-margin-bottom"><span data-bind="text: name">Foo</span></button> 
 
    </li> 
 
</ul> 
 
</div>

+0

Хорошо - но для производительности нажмите вместо этого в локальный массив 'menus', а затем используйте' self.menus (menus) '. Таким образом, вы обновляете наблюдаемый один раз для каждого элемента данных и каждый раз запускаете обновление. – brianlmerritt

+0

Так я никогда не использовал. Я делал так, как писал код. Тогда не будет никакой разницы между рассматриваемым кодом и ответом, кроме изменения кода HTML. – Shrabanee

+1

ps - если данные уже представляют собой массив, то тест 'length' и' for' можно отбросить и просто перейти 'self.menus (результаты)' – brianlmerritt

0

Объекты в вашем меню в вашем инспекторе не имеют свойства имени для привязки. Попробуйте className, или если у вас есть контроль над данными, которые вы получаете, используйте разные имена, такие как name и slug или что хотите.

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