2012-09-19 29 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