2012-09-19 54 views
0

我對Knockout JS相當陌生。我正在嘗試做一個簡單的任務,如果下拉菜單更改顯示幫助文本取決於在下拉列表中選擇的值。Knockout JS +更新幫手文本

我的例子是位於的jsfiddle:http://jsfiddle.net/dnfCb/10/

注:我不知道是否被允許鏈接到的jsfiddle,如果不是我將代碼粘貼在這裏。似乎ko.computed事件僅在加載時觸發。當標準改變時似乎無法啓動它。

謝謝你的時間。

回答

1

您需要將您的<select>值綁定到實際的observable屬性以查看更改。

<-- ------------------------ here....................... --> 
<select name="search_option" data-bind="value: criteria"> 
    <option value="O">Order Search</option> 
    <option value="P">PO Number Search</option> 
</select> 

var orderSearchViewModel = { 
    criteria: ko.observable("O") // give a default value 
}; 

orderSearchViewModel.helperText = ko.computed(function() { 
    if (this.criteria() == "P") { 
     return "Searching by PO Number"; 
    }else { 
     return "Searching by Order Number"; 
    } 
}, orderSearchViewModel); 

ko.applyBindings(orderSearchViewModel);​ 

注意criteria是需要執行,以獲得潛在價值的功能,所以

if (this.criteria == "P") 

是行不通的。

http://jsfiddle.net/dnfCb/11/


順便說一句,我認爲自包含視圖模型建立是一個更好一點:

function OrderSearchViewModel() { 
    var self = this; 

    this.criteria = ko.observable("O"); 
    this.helperText = ko.computed(function() { 
    if (self.criteria() == "P") { 
     return "Searching by PO Number"; 
    } else { 
     return "Searching by Order Number"; 
    } 
    }); 
} 

ko.applyBindings(new OrderSearchViewModel());​ 
+0

謝謝你,這個工程也是如此。我注意到了var self = this這一行。你爲什麼要這麼做?爲什麼不只是引用標準()而不是self.criteria()? – TheWebGuy

+0

@ Gordon因爲在範圍內沒有'criteria',就計算值的函數而言。如果使用'var'聲明'criteria',它就會工作,但事實並非如此。 (提示:當計算函數運行時,'this'指向'window'對象)。聲明'var self = this;'是一種常見的技術來存儲對「父對象」的引用。另一個變體是將'this'作爲第二個參數傳遞給'ko.computed()',就像你在代碼中一樣。 – Tomalak