GroupBy,过滤 knockout.js
GroupBy, Filtering in knockout.js
我如何分组,并使用 knockout.js 在 table 中过滤。我还尝试展开和折叠行,这是我比较成功的代码)。
这是我的 distinc 函数,请注意,目前它似乎只对一个数据元素起作用(我希望它将来能在对象的 属性 上与众不同。
ko.observableArray.fn.distinct = function (prop) {
var target = this;
target.index = {};
target.index[prop] = ko.observable({});
ko.computed(function () {
//rebuild index
var propIndex = {};
ko.utils.arrayForEach(target(), function (item) {
var key = ko.utils.unwrapObservable(item[prop]);
if (key) {
propIndex[key] = propIndex[key] || [];
propIndex[key].push(item);
}
});
target.index[prop](propIndex);
});
return target;
};
这是我当前的对象函数
course(_id, _courseCode, _courseTitle, _courseCampus) {
var self = this;
this.id = ko.observable(_id);
this.courseCode = ko.observable(_courseCode);
this.courseTitle = ko.observable(_courseTitle);
this.coursecampus = ko.observable(_courseCampus);
}
这是我的视图模型
function ViewModel() {
var self = this;
this.courses = ko.observableArray().distinct('courseCode');
this.gpCourseCode = ko.observableArray();
this.mutated = ko.observableArray();
this.switchMutated = function (code) {
if (self.mutated.indexOf(code) > -1) {
self.mutated.push(code);
}
else {
self.mutated.remove(code);
}
};
this.switchText = function (code) {
if (self.mutated.indexOf(code) > -1) {
return "-"
}
else {
return "+"
}
};
self.gpCourseCode.push("MATH1030");
self.gpCourseCode.push("MATH1006");
self.gpCourseCode.push("MATH1046");
self.courses.push(new course("1", "MATH1030", "Calculus", "city1"));
self.courses.push(new course("2", "MATH1030", "Calculus", "city2"));
self.courses.push(new course("3", "MATH1030", "Calculus", "city3"));
self.courses.push(new course("4", "MATH1006", "Linear algebra", "city1"));
self.courses.push(new course("5", "MATH1046", "Discrete Math", "city2"));
self.courses.push(new course("6", "MATH1006", "Linear algebra", "city2"));
self.courses.push(new course("7", "MATH1046", "Discrete Math", "city1"));
this.searchCode = ko.observable("");
self.filteredRecords = ko.computed(function () {
return ko.utils.arrayFilter(self.gpCourseCode(), function (rec) {
return (
(self.searchCode().length == 0 || rec.toLowerCase().indexOf(self.searchCode().toLowerCase()) >= 0)
)
});
});
}
这是我的html
<table class="table">
<thead>
<tr>
<th>ID</th>
<th>Course Code</th>
<th>Course Title</th>
<th>Course Campus</th>
</tr>
<tr>
<th><input data-bind="value: searchCode" placeholder="Course Code" /></th>
<th></th>
<th></th>
<th></th>
</tr>
</thead>
<tbody data-bind="foreach: filteredRecords">
<tr class="table-dark">
<td><span data-bind="text: $data"></span></td>
<td><span></span></td>
<td></td>
<td class="text-right">
<button class="btn btn-secondary" data-bind="click: $root.switchMutated($data), text: $root.switchText($data)"></button>
</td>
</tr>
<!-- ko foreach: $root.courses.index.courseCode()[$data] -->
<tr data-bind="css: { mutated: $root.mutated.indexOf($data.courseCode()) > -1 }">
<td><span data-bind="text: $data.id"></span></td>
<td><span data-bind="text: $data.courseCode"></span></td>
<td><span data-bind="text: $data.courseTitle"></span></td>
<td><span data-bind="text: $data.coursecampus"></span></td>
</tr>
<!-- /ko -->
</tbody>
</table>
这是我的两个问题
- 当我过滤搜索时,我的 mutable 数组变为空,因此所有元素都被展开。
- 我很想将我的 gpCourseCode 转换为类似于课程的 class,但我不确定如何在 class 而不仅仅是一个元素上进行区分。
我有一个 jsfiddle here
When I filter the search, my mutable array becomes empty, therefore all the element become expanded.
那是因为您的点击处理程序有误。它应该采用函数引用而不是函数调用。所以 click: $root.switchMutated($data)
应该变成:click: $root.switchMutated
(在 foreach 中,点击处理程序自动将当前项作为其第一个参数传递)。
然而,您现在必须自己初始化 mutated
数组(或者可能颠倒逻辑,这样您就不必这样做了)。您的点击处理程序是无意中这样做的,因为向点击处理程序提供函数调用将导致该函数被执行。
我如何分组,并使用 knockout.js 在 table 中过滤。我还尝试展开和折叠行,这是我比较成功的代码)。
这是我的 distinc 函数,请注意,目前它似乎只对一个数据元素起作用(我希望它将来能在对象的 属性 上与众不同。
ko.observableArray.fn.distinct = function (prop) {
var target = this;
target.index = {};
target.index[prop] = ko.observable({});
ko.computed(function () {
//rebuild index
var propIndex = {};
ko.utils.arrayForEach(target(), function (item) {
var key = ko.utils.unwrapObservable(item[prop]);
if (key) {
propIndex[key] = propIndex[key] || [];
propIndex[key].push(item);
}
});
target.index[prop](propIndex);
});
return target;
};
这是我当前的对象函数
course(_id, _courseCode, _courseTitle, _courseCampus) {
var self = this;
this.id = ko.observable(_id);
this.courseCode = ko.observable(_courseCode);
this.courseTitle = ko.observable(_courseTitle);
this.coursecampus = ko.observable(_courseCampus);
}
这是我的视图模型
function ViewModel() {
var self = this;
this.courses = ko.observableArray().distinct('courseCode');
this.gpCourseCode = ko.observableArray();
this.mutated = ko.observableArray();
this.switchMutated = function (code) {
if (self.mutated.indexOf(code) > -1) {
self.mutated.push(code);
}
else {
self.mutated.remove(code);
}
};
this.switchText = function (code) {
if (self.mutated.indexOf(code) > -1) {
return "-"
}
else {
return "+"
}
};
self.gpCourseCode.push("MATH1030");
self.gpCourseCode.push("MATH1006");
self.gpCourseCode.push("MATH1046");
self.courses.push(new course("1", "MATH1030", "Calculus", "city1"));
self.courses.push(new course("2", "MATH1030", "Calculus", "city2"));
self.courses.push(new course("3", "MATH1030", "Calculus", "city3"));
self.courses.push(new course("4", "MATH1006", "Linear algebra", "city1"));
self.courses.push(new course("5", "MATH1046", "Discrete Math", "city2"));
self.courses.push(new course("6", "MATH1006", "Linear algebra", "city2"));
self.courses.push(new course("7", "MATH1046", "Discrete Math", "city1"));
this.searchCode = ko.observable("");
self.filteredRecords = ko.computed(function () {
return ko.utils.arrayFilter(self.gpCourseCode(), function (rec) {
return (
(self.searchCode().length == 0 || rec.toLowerCase().indexOf(self.searchCode().toLowerCase()) >= 0)
)
});
});
}
这是我的html
<table class="table">
<thead>
<tr>
<th>ID</th>
<th>Course Code</th>
<th>Course Title</th>
<th>Course Campus</th>
</tr>
<tr>
<th><input data-bind="value: searchCode" placeholder="Course Code" /></th>
<th></th>
<th></th>
<th></th>
</tr>
</thead>
<tbody data-bind="foreach: filteredRecords">
<tr class="table-dark">
<td><span data-bind="text: $data"></span></td>
<td><span></span></td>
<td></td>
<td class="text-right">
<button class="btn btn-secondary" data-bind="click: $root.switchMutated($data), text: $root.switchText($data)"></button>
</td>
</tr>
<!-- ko foreach: $root.courses.index.courseCode()[$data] -->
<tr data-bind="css: { mutated: $root.mutated.indexOf($data.courseCode()) > -1 }">
<td><span data-bind="text: $data.id"></span></td>
<td><span data-bind="text: $data.courseCode"></span></td>
<td><span data-bind="text: $data.courseTitle"></span></td>
<td><span data-bind="text: $data.coursecampus"></span></td>
</tr>
<!-- /ko -->
</tbody>
</table>
这是我的两个问题
- 当我过滤搜索时,我的 mutable 数组变为空,因此所有元素都被展开。
- 我很想将我的 gpCourseCode 转换为类似于课程的 class,但我不确定如何在 class 而不仅仅是一个元素上进行区分。
我有一个 jsfiddle here
When I filter the search, my mutable array becomes empty, therefore all the element become expanded.
那是因为您的点击处理程序有误。它应该采用函数引用而不是函数调用。所以 click: $root.switchMutated($data)
应该变成:click: $root.switchMutated
(在 foreach 中,点击处理程序自动将当前项作为其第一个参数传递)。
然而,您现在必须自己初始化 mutated
数组(或者可能颠倒逻辑,这样您就不必这样做了)。您的点击处理程序是无意中这样做的,因为向点击处理程序提供函数调用将导致该函数被执行。