Это потому, что вы объединили два <li>
s в один, и всплывающее событие события click теперь вызывает другие события переключения на верхних узлах дерева.(Раньше селектор self.contents("li").first()
гарантировал, что событие щелчка пузырька из глубины не было перехвачено. Но теперь более глубокие узлы находятся под тем же li, что и родительские узлы.)
Таким образом, одно исправление состоит в том, чтобы предотвратить пузырение,Вернуть false из обработчика (или вызвать event.stopPropagation()
).
self.contents("li")
.on("click", ".toggle", function() {
self.toggle();
return false;
});
Другой способ - связать событие click с span, а не с li, чтобы он не обнаружил несколько .toggle
целей:
var self = this;
self.contents("li").find(".toggle")
.on("click", function() {
self.toggle();
});
Другой альтернативой является использование привязки тега {{on}} для обработчика щелчков.На самом деле вся реализация в таком случае проще:
$.views.tags({
tree: {
template: '<li>' +
'{{if folders && folders.length}}' +
'<span data-link="{on ~tag.toggle} {:expanded ? \'-\' : \'+\'}" class="toggle"></span>' +
'{{else}}' +
'<span class="spacer">•</span>' +
'{{/if}}' +
'{{>name}}' +
'{^{if expanded}}' +
'<ul>' +
'{{for folders}}' +
'{{tree/}}' +
'{{/for}}' +
'</ul>' +
'{{/if}}' +
'</li>',
//METHODS
toggle: function() {
var data = this.tagCtx.view.data;
$.observable(data).setProperty("expanded", !data.expanded);
}
}
});
Я, вероятно, переключу выборку на такой подход ...