I have multiple input boxes that I want to hide/unhide based on a selection from user.
I can achieve this by having a separate dependentObservable for each input an
Taking the idea from @Arxisos even further, I came up with this.
self.showField = function (fieldName)
{
return ko.dependentObservable(function ()
{
return this.selectedType() ? IsFeatureVisible(this, fieldName) : false;
}, this)();
};
In Knockout, bindings are implemented internally using dependentObservables, so you can actually use a plain function in place of a dependentObservable in your bindings. The binding will run your function inside of a dependentObservable, so any observables that have their value accessed will create a dependency (your binding will fire again when it changes).
Here is a sample: http://jsfiddle.net/rniemeyer/2pB9Y/
html
type "one", "two", or "three": <input data-bind="value: text" />
<hr />
<ul data-bind="template: { name: 'itemTmpl', foreach: items }"></ul>
js
<script id="itemTmpl" type="text/html">
<li data-bind="text: name, visible: viewModel.shouldThisBeVisible(name)"></li>
</script>
var viewModel = {
text: ko.observable("one"),
items: [{name: "one"}, {name: "two"}, {name: "three"}],
};
viewModel.shouldThisBeVisible = function(name) {
return this.text() === name;
}.bind(viewModel);
ko.applyBindings(viewModel);
var someOtherViewModel = {
showField: function(fieldName) {
return ko.dependentObservable(function () {
return viewModel.selectedType() ? IsFeatureVisible(viewModel, fieldName) : false;
}, viewModel);
}
};
You can create a function like the one above. The function returns a new dependent observable for the specific field name.
Now you can do:
<tr data-bind="visible: someOtherViewModel.showField('Field1')">
Inform me if that code doesn't work - maybe I missed something. Then I'll edit this post.