У меня есть viewModel
и шаблон, который предоставляет данные, основанные на if
условия:Нокаут вычислен срабатывает слишком много раз
<!-- ko template: { data: selectedFolder, if: isTemplateVisible, name: 'selectedFoldersProperties-template' } --><!-- /ko -->
Я думаю, что шаблон визуализируется 4 раза подряд, и одна из причин, заключается в том, что isTemplateVisible
является ko.computed
.
Если я меняю if: isTemplateVisible
на if: selectedFolder
, тогда шаблон получается рендерингом 2 раза подряд.
У меня есть демо-версия jsfiddle.
Вы увидите, что «нажатие» выводится в течение 4-х раз после нажатия кнопки.
Есть ли причина, почему функция называется так много раз?
<button id="button" type="button">
Set folder
</button>
<div>
<!-- ko template: { data: selectedFolder, if: isTemplateVisible, name: 'selectedFoldersProperties-template' } --><!-- /ko -->
</div>
<script type="text/html" id="selectedFoldersProperties-template">
<span data-bind="text: FolderName"></span>
<ul data-bind="foreach: $root.getFiles($data)">
<li>
<span data-bind="text: FileName"></span>
</li>
</ul>
</script>
var viewModel = {
selectedFolder: ko.observable(null),
getFiles: function(folderData) {
console.log("hit");
return [
{ FileName: "File 1" },
{ FileName: "File 2" }
];
}
};
viewModel.isTemplateVisible = ko.computed(function(){
return this.selectedFolder();
}, viewModel);
ko.applyBindings(viewModel);
document.getElementById("button").onclick = function() {
viewModel.selectedFolder({
FolderName: "Folder 1"
});
};
Ваш «вычисляемый» оценивается только один раз за клик, для чего это стоит. – ebohlman