Как мога да получа достъп до брой елементи от дъщерна джаджа в Durandal?

Използвам Durandaljs и създавам някои джаджи за многократна употреба. Джаджите са страхотни! Въпреки това, аз се опитвам да създам начин, по който една джаджа да получава броя на елементите в дъщерна джаджа.

Например, имам две джаджи, джаджа с акордеон, която просто позволява секциите на страницата да бъдат сгъваеми, и втора джаджа, която показва елементи в списък.

Имам нужда от заглавието на приспособлението за акордеон, за да имам брой елементи от дъщерния списък от друго приспособление. Или може да показва брой думи, като по същество трябва да посочи какво брои от съдържанието си и това може да се различава в зависимост от типа съдържание, което съдържа.

Мисля, че накратко, просто ми трябва начин да комуникирам между родителска и дъщерна джаджа без познания за твърдо кодиране на една джаджа вътре в другата, програмистът трябва изрично да декларира какъв иска да бъде броят.

Неща, които опитах, но не работят или не ми харесват:

ko.bindingHandlers.counter = {
init: function (element, valueAccessor, allBindingsAccessor, viewModel, bindingContext) {
    alert('init');
    var value = valueAccessor();
    $(element).text(bindingContext.$parent.settings.items.length);
},
update: function (element, valueAccessor, allBindingsAccessor, viewModel, bindingContext) {
    alert('update');
    var value = valueAccessor();
    $(element).text(bindingContext.$parent.settings.items.length);
}
};

Горното не работи, защото когато го накарах да „работи“, той работеше само първоначално, актуализациите не се показваха, защото не наблюдаваше наблюдаем и се променяше на

bindingContext.$parent.settings.items().length

хвърли грешка, защото вътре в bindingContext не е наблюдаема, въпреки че използвах settings.items().length в дъщерния уиджет и това работи, защото е обвързана наблюдаема, която се актуализира.

Бих могъл също да напиша jQuery, за да преброя елементите, но това не изглежда правилно, като се има предвид, че би било специфично за HTML блок, а не за елементи с данни в наблюдаем.

$(document).on('DOMNodeInserted', '.contentWidget', function () {
    var $t = $(this);
    var count = $('.contentItem', $t).length;
    var $parent = $t.closest('[data-countable]');
    var $countEl = $parent.find($parent.attr('data-countable'));
    if ($countEl) {
        $countEl.text(count);
    }
});

И накрая, със сигурност някой друг прави нещо подобно и аз просто още не съм го намерил, или пропускам прост начин да направя това, защото съм пропуснал нещо или в документите за Durandal, или в документите за нокаут.


person Nateous    schedule 12.07.2013    source източник


Отговори (1)


Вместо да се опитвате да получите достъп до джаджа от друга, мисля, че е по-добре да споделяте модели на изглед между джаджи. нещо като това

<div data-bind="accordion:{headerModel:childViewModel}"></div>
<div data-bind="listItems:{itemsModel:childViewModel}"></div>
person Dhana Krishnasamy    schedule 13.07.2013
comment
това е, което накрая направих. Мисля, че това има повече смисъл. в моя случай едната джаджа ще съдържа другата, но идеята е същата. Благодаря! - person Nateous; 17.07.2013