У меня возникли проблемы с привязкой foreach к списку функций. Я хочу, чтобы внутренний контекст был самой функцией, но вместо этого контекст связан с результатом вызова функции. Вот простой пример, который иллюстрирует это: (JSFiddle)Нокаут foreach со списком функций
JS:
ko.applyBindings({
list: [
function() {
return "hodor";
}
]
});
HTML:
<!-- ko foreach: list -->
<span data-bind="text: typeof $data"></span>
<span data-bind="text: $data"></span>
<br />
<!-- /ko -->
Выход: "строка Foo", но я хотел бы, чтобы это было «функция функция() {return "foo";} "
В качестве обходного решения я могу сделать $parent.list[$index()]
, но это действительно уродливо, и я хотел бы избежать этого синтаксиса, если это возможно.
(Для объяснения в моем реальном использовании, они не являются простыми функциями, а функции, которые я присоединенные дополнительные свойства, которые я хочу сослаться, но я не могу ссылаться на них, потому что нокаут их вызов)
EDIT:
Похоже, что здесь есть проблема с версией KO. До 3.0 это не было проблемой, контекст всегда привязывался к функции не к значению. В 3.0, используя $rawData
, вы получите функцию, а не это значение, но на 3.2 это не так, и я пытаюсь ее использовать.
Я обновил выше скрипку использовать 3.2, а вот скрипку для каждой версии, в том числе $rawData
(за исключением 2.3, где $ RAWDATA не существует)
Knockout 2.3 fiddle: $rawData
не нужен
Knockout 3.0 fiddle: $rawData
Knockout 3.2 fiddle: $rawData
не работает.
Это может быть ошибка KO 3.2?
Я уверен, что это какое-то смешение с тем, как предполагается, что функция будет наблюдаемой и поэтому вызывает ее. Одна из возможных работ может заключаться в том, чтобы просто обернуть ваши функции в другую функцию следующим образом: http://jsfiddle.net/dq4ec706/3/, но это кажется действительно, действительно глупым. Он делает работу '$ data' как на 3.0, так и на 3.2, но не на 2.3. –
Да, я бы предпочел использовать '$ parent.list [$ index()]' обходной путь, который всегда срабатывает, а не переносить мои функции снова, лично. – Retsam