【发布时间】:2014-04-20 12:50:48
【问题描述】:
我坚持在 Knockout 中过滤 observableArray。我正在显示人员列表,并希望有一个复选框列表,该列表可以根据选中的复选框实时更新人员列表(例如:年龄:18 -22、23-30、31-36 等。 )
I read Ryan Niemeyer's 关于实用函数的文章,但我仍然很困惑。我不知道如何用过滤后的项目更新可观察数组。
我正在使用 Durandal 和 DozerJS,这是我目前拥有的标记和 shell 文件
<section class="main">
<div class="main--contain">
<a data-bind="click: find25to35">Between 25 and 35</a>
<form>
<input type="search" name="search" placeholder="Search" class="search-input">
</form>
<ul class="user-list" data-bind="foreach: people">
<li>
<h2 data-bind="text: username"></h2>
<h2 data-bind="text: firstname + lastname"></h2>
</li>
</ul>
</div>
define(['knockout'], function (ko) {
var ctor = {
people: ko.observableArray(),
activate: function () {
var self = this;
var request = $.ajax({
url: '/api/users/',
type: 'GET'
});
request.done(function (res) {
if (res.data.length) {
res.data.reverse();
for (var i = 0, z = res.data.length; i < z; i++) {
self.people.push(res.data[i])
}
}
})
},
find25to35: function () {
var self = this;
self.people = [];
ko.utils.arrayForEach(self.people(), function(person) {
if (person.age >=18 && person.age <=25) {
self.people.push(person);
}
});
}
};
return ctor;
});
【问题讨论】:
-
我没有看到您在标记中提到的复选框,也没有看到基于检查输入进行过滤的计算 observable。我假设过滤是基于本地数据的,对吧?或者您要返回服务器获取过滤后的人员。
-
这似乎也不是一个合适的绑定:。我会创建一个 Person 对象并有一个计算的 observable 来连接名字和姓氏。
-
@Hernan 我更新了这个问题。添加了一个锚点(暂时代替复选框),以及一个
find25to35函数,该函数使用arrayForEach遍历people数组,并且应该只使用 18 到 25 岁的人更新该数组. 当然,它不起作用:/我可以让它添加到该数组中,但它不会过滤它们,它只是添加 DOM 中的任何内容(如果我删除了我尝试的self.people = [];行清除数组...
标签: javascript knockout.js filtering durandal