2015-04-02 7 views
1

У меня есть компонент в knockoutjs для создания списка альбомов из Facebook с помощью javascript graph api.Обратный вызов компонентов Knockoutjs после загрузки всех элементов в foreach

Как я могу вызвать функцию после рендеринга всех элементов?

Я пробовал foreach: {data: items, afterRender: afterItemsLoaded} - метод afterItemsLoaded вызывается для каждой строки не после рендеринга всех элементов.

Я пытался использовать следующий код:

HTML:

<h1>List: </h1> 
<list></list> 

Javascript:

var countOfItemLoaded = 0; 

ko.components.register('list', { 
    viewModel: function() { 
    }, 
    template: '<div data-bind="foreach: {data: items, afterRender: afterItemsLoaded}"><div data-bind="text: $data"></div></div>' 
}); 

var viewModel = function() { 
    var self = this; 
    self.items = ko.observableArray([]); 

    $.getJSON("https://graph.facebook.com/410564482402231/albums?fields=photos,name,photos.name", function (result) { 
      $.each(result.data,function(key, item) {    
       self.items.push(item.name); 
      }); 

    }); 


    self.afterItemsLoaded = function() { 
     countOfItemLoaded = countOfItemLoaded + 1; 
     alert("Loaded item " + countOfItemLoaded); 
    } 
}; 

ko.applyBindings(viewModel); 

Demo в jsFiddle:

jsFiddle link

+0

Это то, что вы ищете? Я добавил еще одну переменную, но не смог избежать обратного вызова для каждого компонента. Я просто использовал длину для управления, когда нужно выполнить необходимый код. http://jsfiddle.net/sbjumani/gthqvr5n/3/ – sbjumani

+0

Возможно ли это? подумайте об этом, каждый элемент, который вы добавляете к наблюдаемому массиву, массив и даже KO в этом отношении, не знает, сколько предметов будет добавлено. Я бы предложил вызвать метод loadComplete после добавления всех элементов. Это просто пример http://jsfiddle.net/gthqvr5n/5/ – Lordbalmon

+0

Оба решения работают абсолютно правильно. Я ищу метод или решение, родные в knockoutjs foreach, который будет возвращать этот обратный вызов, есть ли какой-либо метод или я должен использовать это обходное решение, как описано выше? – Jenan

ответ