Подтвердить что ты не робот

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())
4b9b3361

Ответ 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));    
}