Кэшировать вычисляемые значения с нокаутом

Допустим, я хотел бы создать функцию, которая перебирает все элементы в массиве (observableArray) и возвращает соответствующий элемент из массива.

Я думал о создании функции computed для обработки этого и использовании ko.utils.arrayFilter для фильтрации.

Должен ли я кэшировать это действие? Или computed или arrayFilter делают это внутри?


person IgalSt    schedule 19.08.2012    source источник
comment
Значения вычисленных наблюдаемых объектов кэшируются. Их значение вычисляется только изначально и всякий раз, когда изменяется зависимость. Таким образом, вы можете снова и снова обращаться к этому вычисляемому значению и всегда получать кэшированное значение.   -  person RP Niemeyer    schedule 19.08.2012
comment
@RPNiemeyer спасибо. На самом деле я хотел бы, чтобы функция computed основывалась на аргументах. Что-то вроде этого: jsfiddle.net/igalst/EcS27   -  person IgalSt    schedule 19.08.2012


Ответы (1)


Значения вычисленных наблюдаемых объектов кэшируются. Их значение вычисляется только изначально и всякий раз, когда изменяется зависимость. Таким образом, вы можете снова и снова обращаться к этому вычисляемому значению и всегда получать кэшированное значение.

Судя по вашим комментариям, вы хотите создать вычисляемые наблюдаемые на основе определенных аргументов. Пара соображений по поводу этой техники:

  • Привязки для одного элемента выполняются внутри вычисляемого наблюдаемого для отслеживания зависимостей. Это означает, что если вы хотите использовать свой фильтр только в своем пользовательском интерфейсе, вы можете фактически не создавать вычисляемый наблюдаемый объект и просто вызывать функцию фильтра напрямую. Всякий раз, когда зависимость изменяется, ваши привязки срабатывают, и функция снова запускается. Это было бы не лучшим решением, если вы хотите программно взаимодействовать с отфильтрованными данными. Вот пример: http://jsfiddle.net/rniemeyer/QSgPz/

  • Если вы собираетесь часто использовать эту концепцию, вы можете даже расширить observableArrays, чтобы вызывать фильтр непосредственно из observableArray, например: http://jsfiddle.net/rniemeyer/VhCVc/

  • В качестве альтернативы, если у вас есть функция, которая сама возвращает вычисляемое значение, вам нужно убедиться, что вы вызываете ее только один раз для каждого вычисляемого фильтра, который вам нужен. Вы бы не хотели вызывать его из привязки, где он будет воссоздаваться каждый раз при срабатывании привязки (если только у вас не было пользовательской привязки, которая правильно обрабатывала его в инициализации). Вот пример: http://jsfiddle.net/rniemeyer/JrHnT/. Опять же, вы можете расширить observableArrays, чтобы иметь возможность создавать вычисляемые для вас, если вы часто используете это.

Итак, если вы используете это только из привязок, вы можете пропустить вычисление и просто использовать функцию, поскольку привязка использует свою собственную вычисляемую наблюдаемую. Если вам нужно взаимодействовать с ним из вашей модели представления, вы, вероятно, захотите создать там фильтры.

person RP Niemeyer    schedule 19.08.2012