2013-11-22 2 views
0

Первоначально я имел что-то вроде следующего:Нокаут для отображения только если свойство = значение?

<span data-bind="foreach: objects"> 
    <span data-bind="if: object.type() === 'menuItem'> 
     ... 
    </span> 
</span> 

Это технически работал, но на самом деле создал DOM элемент для каждого объекта, независимо от типа, но согласующие из них были единственными «заселенных». Он оставил небольшие пробелы в пользовательском интерфейсе.

Я перешел на использование виртуального элемента, который работает намного лучше, но все еще показывает вверх в DOM в

<!-- ko if: object.type() === 'menuItem'> 
<!-- /ko --> 

для всех nonmatching элементов.

Есть ли способ вставить оператор if в исходный файл foreach или было бы лучше сделать эту логику в viewmodel каким-то образом?

ответ

2

Вы не можете вставлять if в тот же элемент, что и foreach, потому что они пытаются контролировать одно и то же привязку потомка, что является ошибкой, которую вы получите при запуске нокаутом.

http://jsfiddle.net/h92LY/

Использование containerless связывания составляет 100% правильное направление идти. Другой вариант заключается в использовании вычисляемого где условие внутри него, но принимает логику представления в модели представления -

вид модели -

var showingObjects= ko.computed(function() { 
    return ko.utils.arrayFilter(objects(), function(object) { 
     return object.type() === 'menuItem'; 
    }); 
}); 

вид -

<span data-bind="foreach: showingObjects"> 
     ... 
</span> 
+0

Так что, если я есть тысяча объектов, и 5 из них - это меню. Я не должен беспокоиться о комментариях 995 ко в доме? Я не саркастичен, серьезно хочу подтвердить. –

+0

Если вы хотите, чтобы 995 объектов были спрятаны для надлежащей привязки данных и показывали, проверено ли значение, которое вы тестируете на изменения, тогда исправьте, вам нужно оставить там комментарии 995 или пойти с вычисленными, как указано выше. –

+0

Совершенно нормально иметь логику представления в модели представления. Вот почему это ** view ** модель, а не только ** модель **. –

Смежные вопросы