Reputation: 14258
is there a way to define an array and bind it to a view model? or does it have to be defined as an object?:
---- js ----
var arr = [{"id":"1","desc":"1","enabled":true,"tabStr":"/2 * * * * * *"}, {"id":"2","desc":"2","enabled":true,"tabStr":"1-60/2 * * * * * *"}, {"id":"3","desc":"3","enabled":false,"tabStr":"/5 * * * * * *"}]; $(document).ready(function(){ ko.applyBindings(arr); });
----- html ----
<tbody data-bind="foreach: ???">
<tr>
<td data-bind="text: id"></td>
<td data-bind="text: desc"></td>
<td data-bind="text: tabStr"></td>
<td data-bind="text: enabled"></td>
</tr>
</tbody>
Upvotes: 3
Views: 570
Reputation: 7537
Instead of "arr", I use MVC, so I use Model
(I left my version of what I would use as "arr"), and have a @using IEnumerable<MyViewModel>
at the top of my view, and I have the controller doing something like:
public ActionResult Index() {
var data = myDataContext.SomeTable.Where(e => e.blah == "Foo");
return View(data);
}
And this returns something like your arr
, so I think my code, below, should work fine for you:
<table border="1" width="100%" data-bind="foreach: mainArray">
<tr>
<td width="25%">ID</td>
<td width="25%">Desc</td>
<td width="25%">Enabled</td>
<td width="25%">TabStr</td>
</tr>
<tr>
<td width="25%" data-bind="text: id"></td>
<td width="25%" data-bind="text: desc"></td>
<td width="25%" data-bind="text: tabStr"></td>
<td width="25%" data-bind="text: enabled"></td>
</tr>
</table>
<script language="type/Javascript">
var arr = [{"id":"1","desc":"1","enabled":true,"tabStr":"2"},
{"id":"2","desc":"2","enabled":true,"tabStr":"1-60"},
{"id":"3","desc":"3","enabled":false,"tabStr":"5"}];
//var arr = [@Html.Raw(Json.Encode(Model))][0];
$(function () {
var myViewModel = new MyViewModel(arr);
ko.applyBindings(myViewModel);
function MyViewModel(arr) {
var self = this;
self.mainArray = ko.observableArray([]);
if (arr.length > 0) {
for (var i=0; i<arr.length; i++) {
var myDataViewModel = new MyDataViewModel(arr[i]);
self.mainArray.push(myDataViewModel);
}
}
}
function MyDataViewModel(vm) {
//alert(vm.id);
var self = this;
if (vm != null) {
self.id = ko.observable(vm.id);
self.desc = ko.observable(vm.desc);
self.enabled = ko.observable(vm.enabled);
self.tabStr = ko.observable(vm.tabStr);
} else {
self.id = 0;
self.desc = 0;
self.enabled = true;
self.tabStr = 0;
}
}
});
</script>
Working JSFiddle here: http://jsfiddle.net/navyjax2/y75hcr2L/
Upvotes: 0
Reputation: 114792
If you don't want to wrap your array in an object, then you can use the special context variable $data
(or $root
since this is the top-level view model) to bind against the current data. So, your binding would look like:
<tbody data-bind="foreach: $data">
<tr>
<td data-bind="text: id"></td>
<td data-bind="text: desc"></td>
<td data-bind="text: tabStr"></td>
<td data-bind="text: enabled"></td>
</tr>
</tbody>
You can find more information about the context variables here: http://knockoutjs.com/documentation/binding-context.html
Upvotes: 2