Message: TypeError: $parent.Department is not a function;--
I thought I'd tried a different approach. I'm trying to match departments().DetpID and employees().DeptID: http://jsfiddle.net/jjfrick/SSb85/
On Wednesday, May 1, 2013 at 3:45 PM, jjf...@gmail.com wrote:
We'll unfortunately this latest solution is no faster than the previous one by Gunnar. Gunnar if you read this could you be so kind as to give a example of what you were referring to..."process the data/created the hierarchy "manually", before binding, instead of filtering/distincting" from your eariler post.
Thanks, Jeff
--
$(document).ready(function () {
var viewModel = {
employees: ko.observableArray([]),
departments: ko.observableArray([]),
loadEmployees: function () {
OData.read(_serviceURL + "/EmployeeLine?&$filter=pClass eq 1&$orderby=DeptName,LastName",
function (data) {
viewModel.employees.removeAll();
$.each(data.results, function (index, item) {
viewModel.employees.push(ko.mapping.fromJS(item));
});
});
},
loadDepartments: function () {
OData.read(_serviceURL + "/Department?&$filter=showDeptListing eq 1&$orderby=homeDeptDescript",
function (data) {
viewModel.departments.removeAll();
$.each(data.results, function (index, item) {
viewModel.departments.push(ko.mapping.fromJS(item));
});
});
}
};
viewModel.employeesByDept = ko.computed(function () {
var deps = viewModel.departments(),
emps = viewModel.employees(),
listing = [];
ko.utils.arrayForEach(deps, function (dep) {
var depid = dep.DeptID();
listing.push({
department: dep,
employees: ko.utils.arrayFilter(emps, function (emp) {
return emp.DeptID() == depid;
})
});
});
return listing;
});
// Activates knockout.js
ko.applyBindings(viewModel);
viewModel.loadEmployees();
viewModel.loadDepartments();
});function (data) { var deps=$.map(data.results, function (index, item) { return ko.mapping.fromJS(item); }); viewModel.departments(deps); };I guess that would make the initial implementations work quite OK too. Maybe you don't need the items' properties to be observable. If so, you could skip the mapping part.
$(document).ready(function () {
var viewModel = {
departments: [],
loadDepartments: function () {
OData.read(_serviceURL + "/Department?&$filter=showDeptListing eq 1&$orderby=homeDeptDescript",
function (data) {
$.each(data.results, function (index, item) {
viewModel.departments.push({
homeDeptDescript: item.homeDeptDescript
});
});
console.log(viewModel.departments);
});
},
};
// Activates knockout.js
ko.applyBindings(viewModel);
viewModel.loadDepartments();<div data-bind="foreach: departments">
<h2 data-bind="text: homeDeptDescript"></h2>
<hr />
</div>viewModel.departments(tempArray);
console.log(viewModel.departments());Error: Unable to parse bindings.
Message: ReferenceError: DeptID is not defined;
Bindings value: foreach: $root.employeesByDept(DeptID)
ViewModel:
$(document).ready(function () {
function employee(FirstName, LastName, DeptID) {
return {
FirstName: ko.observable(FirstName),
LastName: ko.observable(LastName),
DeptID: ko.observable(DeptID)
};
}
function department(DeptID, homeDeptDescript) {
return {
DeptID: ko.observable(DeptID),
homeDeptDescript: ko.observable(homeDeptDescript)
};
}
var viewModel = {
departments: ko.observableArray([]),
employees: ko.observableArray([]),
loadDepartments: function () {
OData.read(_serviceURL + "/Department?&$filter=showDeptListing eq 1&$orderby=homeDeptDescript",
function (data) {
var deptArray = [];
$.each(data.results, function (index, item) {
deptArray.push({
homeDeptDescript: item.homeDeptDescript
});
});
viewModel.departments(deptArray);
});
},
loadEmployees: function () {
OData.read(_serviceURL + "/EmployeeLine?&$filter=pClass eq 1&$orderby=DeptName,LastName",
function (data) {
var empArray = [];
$.each(data.results, function (index, item) {
empArray.push({
DeptID: item.DeptID,
FirstName: item.FirstName,
LastName: item.LastName,
JobTitle: item.JobTitle
});
});
viewModel.employees(empArray);
});
},
employeesByDept: function (deptId) {
return $.grep(this.employees(), function (e) { return e.DeptID() === deptId(); });
}
};
// Activates knockout.js
ko.applyBindings(viewModel);
viewModel.loadDepartments();
viewModel.loadEmployees();
});
View:
<div data-bind="foreach: departments">
<h2 data-bind="text: homeDeptDescript"></h2>
<!-- ko foreach: $root.employeesByDept(DeptID) -->
<div class="deptContainer">
<strong><span data-bind="text: FirstName"></span>
<span data-bind="text: LastName"></span></strong>
<i><span data-bind="text: JobTitle"></span></i>
</div>
<!-- /ko -->
<hr />
</div>
Thanks, Jeff
return e.DeptID() === deptId();
like so...return e.DeptID === deptId;
Thank you all for you help!