Knockout.js - функция javascript для привязки данных
Есть ли способ вызвать функцию JavaScript для привязки данных следующим образом:
<span id="lblSomePropVal" data-bind="text: MySomeFunction(SomeProperty())" ></span>
То, что я пытаюсь сделать, это вызвать MySomeFunction со значением SomeProperty моей модели просмотра. Моя SomeFunction вернет некоторый текст на основе пройденного значения и будет отображаться в диапазоне lblSomePropVal.
Я пробовал это так, как я написал в примере, но он вызывает ошибку привязки.
Мне что-то не хватает, или есть ли другой способ сделать это?
Это ошибка, которую я получаю:
Microsoft JScript runtime error: Unable to parse bindings.
Message: [object Error];
Bindings value: text: MySomeFunction(SomeProperty())
Ответы
Ответ 1
Вы можете использовать произвольные выражения JavaScript для привязок, но имейте в виду, что они оцениваются в контексте viewmodel, поэтому все функции в выражении должны быть свойствами viewmodel. В вашем случае MySomeFunction должен быть собственностью вашей модели просмотра. Если вы создаете свой viewmodel с помощью плагина сопоставления, вы можете прикрепить дополнительные функции к viewmodel следующим образом:
var viewModel = ko.mapping.fromJS(data.d)
viewModel.MySomeFunction = function(...){...};
Ответ 2
У меня была аналогичная проблема, пытаясь вычислить записи в ячейке таблицы. Для меня работала в том числе "MySomeFunction" в моей модели данных, а затем привязывала данные к ячейкам таблицы как:
<td data-bind="text: $root.MySomeFunction(SomeProperty)"></td>
Ответ 3
Ну, я просто прохожу через учебник самостоятельно, но я думал, что вам нужно настроить свойство и использовать ko.computed, чтобы придать ему значение (из учебника):
function AppViewModel() {
this.firstName = ko.observable("Bert");
this.lastName = ko.observable("Bertington");
this.fullName = ko.computed(function(){
return this.firstName() + " " + this.lastName();
},this);
}
Затем вы можете:
Full name: <strong data-bind="text: fullName"></strong>
Ответ 4
Мне удалось это сделать, используя контекст. Если вам нужен весь код, я могу отправить его вам.
<h2 class="text" data-bind="html: currentProgram($context)"></h2>
function currentProgram(context){
var title = '<font size="1">' + context.$data.name + '</font>';
return title;
}
Вам также необходимо установить этот
$.ajaxSetup({
async: false
});
Ответ 5
<div style="font-size:18px;float:left;width:95%" data-bind="html: trimString(AccountName,25)"></div>
function trimString(value, maxLen) {
//Return undefined, and short strings
if (value === undefined) return undefined;
if (value.length < maxLen) return value;
return value.substring(0, (maxLen - 1));
}