- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
我的 Razor View 如下:
<div id="allMessages" data-bind="foreach: messages">
<!-- ko if: $root.filterMessageTime($data.MessageDate) -->
//Show some messages
<!-- /ko -->
</div>
<div data-bind="visible: lastHourCount() > 1 && selectedFilterMessageTime() == 'Last Hour'">
<p><span class="h4" data-bind="text: lastHourCount()"></span> messages in the <span class="h4">last hour</span>.</p>
</div>
<div data-bind="visible: lastHourCount() == 0 && selectedFilterMessageTime() == 'Last Hour'">
<p>No new messages in the <span class="h4">last hour</span>.</p>
</div>
我的 knockout 功能如下:
function ViewModel() {
var self = this;
var count = 0;
self.lastHourCount = ko.observable(0);
self.lastDayCount = ko.observable(0);
self.lastWeekCount = ko.observable(0);
self.lastMonthCount = ko.observable(0);
self.filterMessageTime = function (MessageDate) {
//Reset Expression
if (count == self.messages().length) {
count = 0;
self.lastHourCount(0);
self.lastDayCount(0);
self.lastWeekCount(0);
self.lastMonthCount(0);
}
if (self.selectedFilterMessageTime() == 'Any' || self.selectedFilterMessageTime() == null) {
return true;
}
count = count + 1;
if (self.selectedFilterMessageTime() == 'Last Hour') {
if (((MessageDate.indexOf('minute') >= 0) || (MessageDate.indexOf('hour') >= 0)) && (MessageDate.indexOf('hours') == -1)) {
self.lastHourCount(self.lastHourCount() + 1);
return true;
}
else
return false;
}
else if (self.selectedFilterMessageTime() == 'Last Day') {
if (((MessageDate.indexOf('day') >= 0) || (MessageDate.indexOf('hours') >= 0) || (MessageDate.indexOf('hour') >= 0) || (MessageDate.indexOf('minute') >= 0)) && (MessageDate.indexOf('days') == -1)) {
self.lastDayCount(self.lastDayCount() + 1);
return true;
}
else
return false;
}
else if (self.selectedFilterMessageTime() == 'Last Week') {
if ((MessageDate.indexOf('days') >= 0) || (MessageDate.indexOf('day') >= 0) || (MessageDate.indexOf('hours') >= 0) || (MessageDate.indexOf('hour') >= 0) || (MessageDate.indexOf('minute') >= 0)) {
self.lastWeekCount(self.lastWeekCount() + 1);
return true;
}
else
return false;
}
else if (self.selectedFilterMessageTime() == 'Last Month') {
if ((MessageDate.indexOf('month') >= 0) || (MessageDate.indexOf('days') >= 0) || (MessageDate.indexOf('day') >= 0) || (MessageDate.indexOf('hours') >= 0) || (MessageDate.indexOf('hour') >= 0) || (MessageDate.indexOf('minute') >= 0)) {
self.lastMonthCount(self.lastMonthCount() + 1);
return true;
}
else
return false;
}
return false;
};
}
方法论:
对于我拥有的每条用户消息,如果用户指定过滤器,则:
MessageDate
计算该过滤器范围内的消息数量,并将它们放在可观察对象中,即 self.lastMonthCount()
将保存该金额上个月的消息数计数
达到消息总数时,我们希望重置计数以及可观察计数器,以便可观察计数不会超过任何值。问题:
似乎我对我的可观察量有某种形式的循环依赖,因为运行函数时存在问题,即“重置”表达式永远无法正确计算,并且似乎函数循环的数量很大(大于Observables 中的消息数量。
注释:
null
和 undefinied
。最佳答案
你的做法是错误的。
如果您有一个包含对象列表的 View 模型,并且希望使它们可过滤,那么您需要做的就是
剩下的就自然而然了。
function ViewModel() {
var self = this;
self.availableFilters = ['any', 'last hour', 'last day', 'last week', 'last month'];
self.activeFilter = ko.observable(self.availableFilters[0]);
self.allMessages = ko.observableArray([/* ... fill this ... */]);
self.filteredMessages = ko.pureComputed(function () {
return self.filterMessages(self.activeFilter());
});
self.filteredMessagesCount = ko.pureComputed(function () {
return self.filteredMessages().length;
});
self.filterMessages = function (filter) {
return ko.utils.arrayFilter(self.allMessages(), function (message) {
var d = message.Date();
switch (filter) {
case 'any': return true;
case 'last hour': return (d.indexOf('minute') >= 0 || d.indexOf('hour') >= 0) && d.indexOf('hours') == -1;
case 'last day': return (d.indexOf('day') >= 0 || d.indexOf('hours') >= 0 || d.indexOf('hour') >= 0 || d.indexOf('minute') >= 0) && d.indexOf('days') == -1;
case 'last week': return d.indexOf('days') >= 0 || d.indexOf('day') >= 0 || d.indexOf('hours') >= 0 || d.indexOf('hour') >= 0 || d.indexOf('minute') >= 0;
case 'last month': return d.indexOf('month') >= 0 || d.indexOf('days') >= 0 || d.indexOf('day') >= 0 || d.indexOf('hours') >= 0 || d.indexOf('hour') >= 0 || d.indexOf('minute') >= 0;
default: return false;
}
});
};
}
和
<select data-bind="options: availableFilters, value: activeFilter"></select>
<div id="allMessages" data-bind="foreach: filteredMessages">
// show the message
</div>
<div>
<p>
<!-- ko if: filteredMessagesCount -->
<span class="h4" data-bind="text: filteredMessagesCount"></span> messages
<!-- /ko -->
<!-- ko ifnot: filteredMessagesCount -->
No new messages
<!-- /ko -->
<!-- ko ifnot: activeFilter() === 'any' -->
in the <span class="h4" data-bind="text: activeFilter"></span>
<!-- /ko -->
</p>
</div>
<小时/>
话虽如此,您过滤消息的方法(通过多个 indexOf()
调用)并不是很漂亮。
基于正则表达式的怎么样:
function ViewModel() {
var self = this;
self.availableFilters = [
{name: 'any', include: /./, exclude: null},
{name: 'last hour', include: /minutes?|hour/i, exclude: /hours|days?|weeks?|months?/i},
{name: 'last day', include: /minutes?|hours?|day/i, exclude: /days|weeks?|months?/i},
{name: 'last week', include: /minutes?|hours?|days?|week/i, exclude: /weeks|months?/i},
{name: 'last month', include: /minutes?|hours?|days?|weeks?|month/i, exclude: /months/i}
];
self.activeFilter = ko.observable(self.availableFilters[0]);
self.allMessages = ko.observableArray([/* ... fill this ... */]);
self.filteredMessages = ko.pureComputed(function () {
return self.filterMessages(self.activeFilter());
});
self.filteredMessagesCount = ko.pureComputed(function () {
return self.filteredMessages().length;
});
self.filterMessages = function (filter) {
return ko.utils.arrayFilter(self.allMessages(), function (message) {
var d = message.Date();
return filter.include && filter.include.test(d) &&
!(filter.exclude && filter.exclude.test(d));
});
};
}
和
<select
data-bind="options: availableFilters, optionsText: 'name', value: activeFilter"
></select>
View 的其余部分是相同的,除了对 activeFilter()
的引用必须更改为 activeFilter().name
。
关于javascript - KnockoutJS 清除函数内的 Observable,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/29232230/
我已经使用 knockout js 实现了一个简单的 spa,您可以在其中在多个页面之间导航,每个页面都呈现一个 View 模型。菜单是一个 2 级菜单,因此我有主页面和子页面。我用knockout的
我想使用组件作为表格行模板,但似乎找不到方法,这可能吗? 当我执行以下操作时,它不会将组件放在 tbody 中,而是将其放在表格上方。 组件 模板 最佳答案
我希望能够将单击和双击事件绑定(bind)到一段文本。我知道我可以使用 data-bind ="event: { dblclick: doSomething } 双击,但我还需要能够在单击时执行不同的
我是否可以告诉 knockout 映射插件订阅所有属性更改调用某个函数? 我意识到我可以通过这种方式手动订阅属性更改事件: var viewModel = { name: ko.observa
我想要一个可见或不可见,具体取决于我的 javascript 中的 bool 值。 我的 HTML 是: Remove
我想将此 json 映射到自定义对象。问题是项目不是 typeof Item 对象而是普通对象。我在这里缺少什么? 你可以在这里测试:http://jsfiddle.net/5jhpE/ var js
我有一个 self 描述的定义如下: var my_data = { types: { typeA: {fieldX: { type: "string"}}, typeB:
首先看一下: http://pastebin.com/823NMiWc 这是 Knckoutjs + Jquery Raty 插件 假设这些是数据库中的列: story_rev: ko.observa
我正在使用 knockout.js 并尝试设置我的选择绑定(bind)的默认值(不使用 optionCaption),并在有人更改它时捕获该值。
我目前有一个数字框,用户可以在其中输入数字 1、2 或 3,并在此基础上设置一些条件格式。 但是,我希望数字字段成为一个下拉列表,其中显示“短”、“长”和“非常长”之类的内容,但在幕后,传递的实际值是
我正在寻找一些有关如何创建代表我的评论系统中的帖子的模型的指南。本质上,它是 Facebook 的简化版本,其中有不同用户的帖子,每个帖子都有零个或多个评论。亲子关系始终只有一层。 创建 Post 对
我需要为数组的每个元素计算一个可观察值。此计算可观察量的解析需要依赖于每个数组元素上下文中存在的其他属性。 请检查以下示例案例: 这是 KnockoutJS foreach 绑定(bind)到嵌套数组
我在网格中有一个嵌套的组产品选项数组。我想要一个弹出编辑器,列出每个分组产品选项的所有产品(产品选项行),并允许用户检查它们之间的关系。我遇到过多对多关系的示例,但没有看到 self 引用分组多对多的
我正在使用KnockoutJs构建一个搜索列表,代码如下: HTML: 部分Js搜索功能: this.name = ko.observable(''); this.query = ko
我是 KnockoutJS 新手。我有一个按以下方式工作的应用程序: 加载页面时,复杂的数据结构会传递到前端 该数据结构被分成更小的 block ,这些数据 block 被传递给组件 用户与组件交互以
我有一个 ASP.Net MVC 网站,在 View 中使用 KnockoutJS 和 KOGrid。它动态地呈现某一特定列中的超链接,如下所示: cellTemplate: '' 已决定,单击时,浏
我正在使用javascript和knockoutjs来使用viewmodel实现搜索过滤器。我无法让搜索过滤器工作。下面是我的js文件 //Object Constructor Class for L
我使用 KnockoutJS 来创建工作申请网站,并使用 JS 中的 getJSON 方法。 不幸的是,我得到了这个结构: 办公室 纽约 部门 金融 职位 示例 ... IT 物流 营销 华盛顿 部门
我在这里创建了一个问题示例: http://jsfiddle.net/JustinN/qWeLT/1/ 我的实际代码已连接到 ASP.NET Web 方法,因此示例代码已调整为指向公共(public)
在过去的几天里,我对 Knockoutjs 越来越感兴趣。它看起来非常有前途,因为它对 MVVM 模式和 WPF 进行了类似绑定(bind)的建模,但每当它为非 RIA Web 应用程序带来一些有用的
我是一名优秀的程序员,十分优秀!