当淘汰赛中其他可观察值发生变化时,更新可观察值

时间:2014-06-12 09:19:51

标签: knockout.js

我有以下观点:

<div class="form-group">
    <label>Company Name</label>
    <input type="text" class="form-control" data-bind="text: $root.CompnayNameFilter">
</div>
<div class="form-group">
    <label>Phone Number</label>
    <input type="text" class="form-control" data-bind="text: $root.PhoneNumberFilter">
</div>
<div class="form-group">
    <label>User Name</label>
    <input type="text" class="form-control" data-bind="text: $root.UsernameFilter">
</div>
<div class="form-group">
    <label>Database Location</label>
    <input type="text" class="form-control" data-bind="text: $root.DatabaseLocationFilter">
</div>

我有以下视图模型:

var viewModel = {
    CompnayNameFilter: ko.observable(),
    PhoneNumberFilter: ko.observable(),
    UsernameFilter: ko.observable(),
    DatabaseLocationFilter: ko.observable(),
    DoFilterOnFilteredData:ko.computed(function(){
          // code to update DoFilterOnFilteredData to false when any other observable changes
    })
}

我的要求是,无论何时用户输入新值或更改Company NamePhone NumberUser NameDatabase Location文本框中的值,我都必须设置{ {1}}值为false。我怎样才能做到这一点?我认为这可以使用计算的observable。

P.S:如果可能的话,请提供一个小提琴。

修改

JSFiddle:http://jsfiddle.net/seadrag0n/dytre/

2 个答案:

答案 0 :(得分:5)

您可以使用subscribe函数实现此目的:

self.CompnayNameFilter.subscribe(function (value) {
    self.DoFilterOnFilteredData(!!value);

});

self.PhoneNumberFilter.subscribe(function (value) {
    self.DoFilterOnFilteredData(!!value);
});

self.UsernameFilter.subscribe(function (value) {
    self.DoFilterOnFilteredData(!!value);
});

self.DatabaseLocationFilter.subscribe(function (value) {
    self.DoFilterOnFilteredData(!!value);      
});

更新:

这是你的小提琴的修改工作版本: http://jsfiddle.net/DianaNassar/dytre/4/

答案 1 :(得分:1)

这是完整的工作示例。

jsiddle:http://jsfiddle.net/CodingDawg/dytre/3/

 var viewModel = {
    DoFilterOnFilteredData: ko.observable('true'),
    CompnayNameFilter: ko.observable(),
    PhoneNumberFilter: ko.observable(),
    UsernameFilter: ko.observable(),
    DatabaseLocationFilter: ko.observable(),
}

$(function () {
    var handler = function (value) {
        viewModel.DoFilterOnFilteredData( !! value);
    }
    viewModel.CompnayNameFilter.subscribe(handler);
    viewModel.PhoneNumberFilter.subscribe(handler);
    viewModel.UsernameFilter.subscribe(handler);
    viewModel.DatabaseLocationFilter.subscribe(handler);
    ko.applyBindings(viewModel);
});