- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
我坚持在 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;
});
最佳答案
以下行将不起作用...
<h2 data-bind="text: firstname + lastname"></h2>
knockout 很聪明,但并不那么聪明。您需要像这样向您的个人 View 模型添加一个计算可观察对象...
function Person(person) {
var self = this;
self.username = ko.observable(person.userName);
self.firstname = ko.observable(person.firstName);
self.lastname = ko.observable(person.lastName);
self.age = ko.observable(person.age);
self.name = ko.computed(function () {
return self.firstname() + self.lastname();
});
}
这会将您的绑定(bind)更改为...
<ul class="user-list" data-bind="foreach: people">
<li>
<h2 data-bind="text: username"></h2>
<h2 data-bind="text: name"></h2>
</li>
</ul>
然后您可能想要添加一个筛选人员列表,加载所有符合条件的人,首先从所有人开始,然后清除它并重新加载符合您条件的人。如果有人想通过一套新的标准来找人怎么办?您真的要再次调用 AJAX 来获取每个人吗?我的经验是,除非您正在运行复杂的自定义搜索,否则最好只获取一次数据并让用户对其进行操作。这意味着您最终会得到一个与此类似的数组...
filteredPeople: ko.observableArray([]),
// -- your other relevant code goes here ---
find25to35: function () {
var self = this;
// set how many people are currently in array
var count = filteredPeople().length;
// loop through array to get rid of all elements to clear it,
// making sure we're not modifying the collection as we are
// iterating through it which creates pointer errors
for (var i = 0; i < count; i++) {
filteredPeople().pop();
}
ko.utils.arrayForEach(self.people(), function(person) {
if (person.age() >= 25 || person.age() <= 35) {
filteredPeople.push(person);
}
});
}
不要忘记 Knockout observables 上的括号,因为这些 observables 实际上是返回对象的方法,您希望它们返回您放入其中的内容,而不是用于跟踪其当前值的缩小(或完整)方法这将导致 Undefined
错误。哦,当您应用绑定(bind)时,为了安全起见,因为您使用的是顶级函数,所以您可能需要像这样添加对它的引用...
<a data-bind="click: $root.find25to35">Between 25 and 35</a>
并且您的人员列表的绑定(bind)会更改以反射(reflect)过滤...
<ul class="user-list" data-bind="foreach: filteredPeople">
最后,考虑使该函数更具动态性,以便能够将其重新用于其他搜索条件,否则您将违反 DRY principle .考虑以下...
<a data-bind="click: $root.findByAge($data, minAge, maxAge)">Find By Age</a>
... 并以此为基础使您的输入具有功能性和可重用性。请记住,如果您使用 jQuery 来获取它们的值,则它们不需要在表单中。
编辑说明:意识到我忘记清除正确的可观察对象并且没有注意到方法中的年龄不正确导致了所有的麻烦。代码已修复。
关于javascript - 在 Knockout 中过滤 observableArray,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/22418400/
我有 2 个 observablearray。 当我将项目从 observablearray1 复制到 observablearray2 并更改 observablearray2 中的值时,obser
我正在使用这个名为 Dragula 的插件,它需要一个 ObservableArray 作为数据源。 HTML/Knockout 绑定(bind)
我是 JS 和 Knockout 的新手。我想将 observableArray 中的特定 observable 复制到另一个 observableArray。我怎样才能做到这一点? HTML
我在使用 Knockout.js 过滤可观察数组时遇到问题 我的js: 包含数据的数组 var docListData = [ { name: "Article Name 1", info:
我有这个模型,一个Foo有很多FooItem。如何向 FooItem 添加对象? 我有这段代码,您可以建议甚至删除最适合此场景的整个代码 var Foo = function (selected) {
我有以下 View 模型: function instance(id, FirstName){ $.extend(this, { id: ko.observable(id ||
我有这段代码,我希望渲染从 REST 查询的菜单: var PageViewModel = function() { var self = this; //
我发现这个问题与我的类似 - Replace all elements in Knockout.js observableArray 我还有另一个问题 - 如果我用新内容替换 observableAr
我正在尝试使用 knockoutJS 填充级联 select2 下拉列表。当使用静态数据时,代码似乎工作正常,如 function staticbuildData() 中所示。 ,但在使用函数 fun
knockoutjs 新手,我正在遵循有关加载和保存数据的教程,但我遇到了一些麻烦。当我将对象推送到数组时,该数组为空。我也在使用表格。这是我的代码, function Quiz(data) {
我正在开发一个项目,其中有一个搜索字段,可以根据搜索框中输入的内容过滤 observableArray。 这是我的 html 代码: 这是我的js代码: var Bu
我在客户端开发环境中工作,必须遵守他们的编码标准。我有以下 JS 和 HTML。我的 observableArray 未定义。我无法让它工作。甚至 console.logs 也打印了正确的值。 请不要
我有一个动态数据对象,因为它是从 WebApi 加载数据调用中读取的......然后使用以下方法将其转换为可观察对象: $.get("/api/PlateTemplate/Get", { id: s
我想为可观察数组中的元素设置动画。 我不会在 observableArray 中添加或删除项目。 考虑到以下 jsfiddle,我想调用 animateFirstElement 函数并突出显示行星“M
我有一个计算的可观察对象,它返回我的 observableArray 的过滤、排序版本,但排序根本不起作用。 这里是 My fiddle String.prototype.contains = fun
我想要一个 ko.observableArray 维护自己的排序顺序,其中排序顺序取决于每个项目的计算属性。 我希望它能工作: var threads = ko.observableArray().e
我有一个类似的 View 模型 AppViewModel = { agent : ko.observableArray([ { name : 'test',
我编写了简单的示例来了解 ko.observableArray 的工作原理。 **HTML**: Count is : JS: var anotherObservableArray = ko.ob
我有一个由 AJAX 调用填充的可观察数组,但它没有更新。 function ViewModel() { var self = this; self.FinanceTypes = ko
我有两个带有对象的 observableArray: self.firstHorizontalLineArr = ko.observableArray([{color: "red", val: 0},
我是一名优秀的程序员,十分优秀!