У меня есть компонент в 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:
Это то, что вы ищете? Я добавил еще одну переменную, но не смог избежать обратного вызова для каждого компонента. Я просто использовал длину для управления, когда нужно выполнить необходимый код. http://jsfiddle.net/sbjumani/gthqvr5n/3/ – sbjumani
Возможно ли это? подумайте об этом, каждый элемент, который вы добавляете к наблюдаемому массиву, массив и даже KO в этом отношении, не знает, сколько предметов будет добавлено. Я бы предложил вызвать метод loadComplete после добавления всех элементов. Это просто пример http://jsfiddle.net/gthqvr5n/5/ – Lordbalmon
Оба решения работают абсолютно правильно. Я ищу метод или решение, родные в knockoutjs foreach, который будет возвращать этот обратный вызов, есть ли какой-либо метод или я должен использовать это обходное решение, как описано выше? – Jenan