2012-03-02 138 views
18

有沒有辦法我可以調用數據綁定JavaScript函數是這樣的:Knockout.js - 數據綁定JavaScript函數

<span id="lblSomePropVal" data-bind="text: MySomeFunction(SomeProperty())" ></span> 

我所試圖做的是與SomeProperty的價值通話MySomeFunction我的視角模型。我的SomeFunction將根據傳遞的值返回一些文本,並將顯示在span lblSomePropVal中。

我試過了我在示例中寫入的方式,但它會引發綁定錯誤。

我在這裏錯過了什麼,或者有沒有其他方式做到這一點?

這是我收到的錯誤:

Microsoft JScript runtime error: Unable to parse bindings. 
Message: [object Error]; 
Bindings value: text: MySomeFunction(SomeProperty()) 
+0

試試'數據綁定= 「TEXT:MySomeFunction.bind(SomeProperty())」' – sll 2012-03-02 16:53:08

+0

嘗試。不工作。 – Asdfg 2012-03-02 17:04:38

回答

12

你可以使用任意JavaScript expre但請記住,它們是在視圖模型的上下文中進行評估的,因此表達式中的所有函數都必須是viewmodel的屬性。在你的情況下,MySomeFunction必須是你的視圖模型的屬性。如果您在使用映射插件創建視圖模型,你可以附加其他功能,像這樣的視圖模型:

var viewModel = ko.mapping.fromJS(data.d) 
viewModel.MySomeFunction = function(...){...}; 
+0

抱歉打擾你,但我一直得到'MySomeFunction'未定義? – 2013-08-07 14:22:55

+0

使用這種方法時,我也不斷地收到「未定義」。 – svante 2016-10-04 21:11:10

+0

得到完全限定它,否則它不能被看到......假設它在一個庫或模塊內 – Clarence 2017-08-17 23:04:01

5

好吧,我只是通過教程去自己,但我認爲你必須建立一個屬性,並使用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> 
+1

我知道這可以做到,但我想知道如果我可以在綁定屬性中調用一個JS函數,這樣我就不必編寫大量的JS代碼來操縱每個屬性了。 – Asdfg 2012-03-02 16:41:48

+0

Peter就在這裏。你可以在你的viewmodel中構建你的函數,它會起作用。例如,如果MySomeFunction在上面的AppViewModel中,則可以稱它爲好。另外,你可以使用像'.toUpperCase()'這樣的基本JavaScript東西,在data-bind – deltree 2012-03-02 16:49:44

+0

裏面我認爲這是行不通的,因爲我的功能在視圖模型之外。我用knockout映射器來聲明我的viewmodel(var viewModel = ko.mapping.fromJS(data.d);)。我如何將函數附加到我的viewmodel下面? – Asdfg 2012-03-02 17:04:09

12

我有一個類似的問題,嘗試計算表單元格條目。什麼工作對我來說是包括我的數據模型「MySomeFunction」,然後數據綁定我的表格單元格爲:

<td data-bind="text: $root.MySomeFunction(SomeProperty)"></td> 
+3

如果你仍然遇到麻煩,請嘗試''確保$ root擁有你期望的屬性。 – 2015-01-23 21:09:37

1

我已成功使用上下文來做到這一點。如果你需要整個代碼,我可以把它發送給你。

<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 
     }); 
0
<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));  
}