Рассмотрим следующие свойства внутри ViewModelKnockout и наблюдаемый массив несовпадение
self.allValues = ko.observableArray();
self.selectedValues = ko.observableArray();
На редактирования, selectedValues
содержит значения, поступающие из базы данных. Вот в чем проблема: selectedValues
содержит элементы, не включенные в allValues
, но они не те же экземпляры. Они одинаковы с точки зрения значений свойств, но на самом деле являются разными объектами.
Это приводит к тому, что каждый раз, когда нокаут использует indexOf
над allValues
, используя объекты от selectedValues
, всегда не удается найти объект.
Я использую selectedValues
на привязке checked
, но не проверяет правильные элементы, включенные в этот массив.
<div class="vars-list" data-bind="foreach: allValues">
<input type="checkbox" data-bind="checkedValue: $data...(etc)
checked: selelectedValues" />
</div>
Есть ли способ для нокаута для сопоставления объектов по значениям свойств вместо адреса памяти?
проверяемого связывание внутренне использует 'indexOf', чтобы проверить, какой элемент выбран, и это сравнение не настраивается. Таким образом, у вас есть два варианта создания пользовательской привязки, основанный на привязке 'checked', где вы можете провести свое сравнение. Или когда вы загружаете свой массив 'selectedValues' вместо создания нового объекта, вы просматриваете элемент из' allValues'. Таким образом, 'selectedValues' будет содержать экземпляры, которые находятся в массиве' allValues'. http://jsfiddle.net/NQYW9/ – nemesv
@nemesv: Я слежу за поиском, но кажется немного грязным, поэтому я хотел узнать альтернативный вариант. Я буду проверять пользовательскую привязку. Благодаря! – StackOverflower
Функция нокаута: позволяет настроить сравнение. Я согласен с тем, что подход поиска грязный. Я на самом деле боролся с аналогичной ситуацией с выпадающим списком, и меня направили на этот пост. http://stackoverflow.com/questions/20411739/knockout-js-setting-selectedoption-to-an-object?noredirect=1#comment30493376_20411739 – Airn5475