I have the following controller:
public JsonResult EquipmentSelect(string term)
{
var equipmentSearchViewModel = new EquipmentSearchViewModel
{
EquipmentList = iEquipmentRepository.FindBy(t => t.equipment_name.Contains(term)
|| t.equipment_id.Contains(term)),
};
var filteredEquipment = equipmentSearchViewModel.EquipmentList.ToList();
var sortableData = filteredEquipment.AsQueryable();
var jsonData = new
{
rows = (
from m in filteredEquipment
select new
{
equipment_id = m.equipment_id,
equipment_name = m.equipment_name
}
).ToArray()
};
return Json(jsonData, JsonRequestBehavior.AllowGet);
}
and the follow js file:
$(function () {
$('#search').click(function () {
var searchText = $('#txtsearch').val();
getEquipment(searchText);
})
})
// View model declaration
var EquipmentViewModel = {
Profiles: ko.observableArray([])
};
// Bind the equipment
bindData = function (equipment) {
var EquipmentViewModel = {
Profiles: ko.observableArray([])
};
EquipmentViewModel.Profiles(equipment);
ko.applyBindings(EquipmentViewModel);
}
getEquipment = function (searchTerm) {
var url = 'EquipmentSelect/Equipment';
$.ajax({
url: url,
cache: false,
contentType: 'application/json',
data: '{"term": "' + searchTerm + '"}',
type: "POST",
success: function (result) {
bindData(result.rows);
},
error: function (jqXHR) {
$('#message').html(jqXHR.statusText);
}
});
}
and finally my view:
@{
ViewBag.Title = "KnockoutExample";
}
<script src="~/Scripts/knockout-2.2.1.js"></script>
<script src="~/Scripts/knockout.mapping-latest.js"></script>
<script src="~/Scripts/koViewModel.js"></script>
<link href="~/Content/bootstrap.min.css" rel="stylesheet" />
<h2>Knockout Example</h2>
<div>
<fieldset>
<legend>Search</legend>
<span>Search For</span>
<input type="text" name="txtsearch" id="txtsearch" />
<input type="button" value="Submit" id="search"/>
</fieldset>
</div>
<table id="myTable" class="table table-striped table-bordered table-condensed">
<tr>
<th>Equipment ID</th>
<th>Equipment Name</th>
</tr>
<tbody data-bind="foreach: Profiles">
<tr">
<td data-bind="text: equipment_id"></td>
<td data-bind="text: equipment_name"></td>
</tr>
</tbody>
</table>
<p id="message"></p>
When I click the search button I get the results I am after. If I click it a second time, I get the same data but duplicated for each of the original count. For example, if the initial call returns 20 items, the second click returns 20 each of the twenty items. I need to clear my viewmodel somehow and repopulate each time the search button is clicked.