2013-10-07 2 views
0

У меня есть класс модели с несколькими функциями (методами), прилагаемыми к нему. Когда я смотрю на длину наблюдаемого массива вне функций, длина возвращается правильно. Но когда я смотрю на наблюдаемый символ внутри функции класса моделей, он всегда возвращает 0. Но если я получаю доступ к элементу внутри наблюдаемого символа по индексу внутри функции, он возвращает правильный элемент. Почему длина всегда будет 0?0 длина ObserveableArray при доступе внутрь функция

function ModelView(data) { 
     var self = this; 


     self.items= ko.observableArray(data.items); 
     var test = self.items().length; //shows correct number 
     self.EditRule = function (product) { 
     for(var i=0; i<self.items().length; i++) 
       //dosuff but self.items().length is always 0 


     } 
    } 

Я нашел работу вокруг, добавив дополнительное свойство в ViewModel, как так:

 self.itemslength = ko.observable(self.items().length); 

, очевидно, мой фактический вопрос гораздо более сложный, но цикл делает сравнение элементов с параметрами, передаваемыми чтобы убедиться, что что-то действительно. self.items - это в основном основной список.

+0

, возможно, придется положить его в jsFiddle. Кажется, хорошо выше. –

+0

Что произойдет, если вы замените тело цикла на 'console.log (i)' (я имею в виду, что вы действительно замените, а не просто вставляете журнал в начале)? – ebohlman

ответ

1

попробуйте использовать ko.utils.arrayForEach для итерации над observableArray:

function ModelView(data) { 
     var self = this; 
     self.items = ko.observableArray(data.items); 
     var test = self.items().length; //shows correct number 
     self.EditRule = function() { 
      ko.utils.arrayForEach(self.items(), function(item){ 
       if (item.name === "2"){ 
        // For example 
        console.log(self.items().length); //will be 3 
        self.items.remove(item); 
        console.log(self.items().length); //will be 2 
       } 
      }); 
     } 
} 

var myData = { 
    items : [{id: 0, name: "0"},{ id: 1, name: "1"}, {id: 2, name: "2"}] 
} 

var myModelView = new ModelView(myData); 
ko.applyBindings(myModelView); 

с этим HTML я тестируемой:

<ul data-bind="foreach: items"> 
    <li data-bind="text: name"></li> 
</ul> 
<a href="#" data-bind="click: EditRule">EditRule</a> 

Вы также можете использовать ваниль для цикла, если вы хотите: Его очень похож на ваш но вы можете ошибаться в другом месте.

function ModelView(data) { 
     var self = this; 
     self.items = ko.observableArray(data.items); 
     var test = self.items().length; //shows correct number 
     self.EditRule = function() { 
      for(var i =0; i < self.items().length; i++){ 
       if (self.items()[i].name === "2"){ 
        // For example 
        console.log(self.items().length); //will be 3 
        self.items.remove(self.items()[i]); 
        console.log(self.items().length); //will be 2 
       } 
      } 
     } 
} 
+0

Я отметил это как ответ, потому что это жизнеспособное решение. Но я не понимаю, почему я не могу получить длину наблюдаемого массива в «методе/функции» класса модели представления, к которому он принадлежит. Это похоже на ошибку. Могли бы вы объяснить? Потому что это не проблема масштаба (если это не проблема конкретного типа JS). – DanScan

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