我开发了一个带有 knockout/Breeze 的项目。
我想知道是否可以强制 knockout 以将可观察对象标记为已更改(即使焦点仍在现场)。我的目标是通知用户,每当他开始更改日期时,他都可以保存它(立即显示一个按钮)。例如,我有一个带日期的输入字段。用户开始在此字段中编辑日期。当用户离开该字段的焦点时,observable 应该只解释新的编码日期。但我想展示我的Save button
一旦他开始在输入字段中输入内容。我希望我很清楚。
这是我的 bindingHandlers,用于在我的输入中处理编辑日期:
ko.bindingHandlers.dateRW = {
//dateRW --> the 'read-write' version used both for displaying & updating dates
init: function (element, valueAccessor, allBindingsAccessor) {
var observable = valueAccessor();
var value = ko.utils.unwrapObservable(valueAccessor);
//handle the field changing
ko.utils.registerEventHandler(element, "change", function () {
var myDate = moment($(element).val(), "DD/MM/YYYY");
observable(myDate.toDate());
});
//ko.utils.registerEventHandler(element, "keyup", function () {
// As soon as user begin to type something, I would like to show my save button
//});
},
update: function (element, valueAccessor, allBindingsAccessor) {
var value = ko.utils.unwrapObservable(valueAccessor());
var date = (typeof value !== 'undefined') ? moment(value) : null;
var dateFormatted = (date != null) ? date.format('DD/MM/YYYY') : '';
$(element).val(dateFormatted);
}
};
而我的观点:
<input type="text" data-bind="dateRW: myDate" />
不幸的是
valueUpdate: 'afterkeydown'
不起作用,因为我使用的是自定义 bindingHandlers。希望有人能指出我正确的方向。
谢谢。
最佳答案
试试 observable.valueHasMutated()
编辑
在您提到的其他评论中,您将启用的保存绑定(bind)到“context.hasChanges()”(从 Breeze EntityManager 更新?)。
我相信 Breeze 不会更新 hasChanges
通过订阅 Knockout 可观察通知。我认为它实际上包含了 observable 设置功能,并且还检查以确保该值实际上正在改变。换句话说,我相信您实际上必须更改您的 observables 值(然后返回)才能触发 hasChanges()
.
另一个(不太好的)选项可能是尝试返回可观察对象的父对象并获取它的EntityAspect
。 .然后您可以调用` setModified() '。在绑定(bind)处理程序中执行所有这些操作似乎是个坏主意,因为它真的开始假设您要绑定(bind)的可观察对象是 Breeze 实体上的一个属性。
您可能最好(没有双关语)考虑类似于迈克尔的答案的选项。也许创建一个 saveEnabled()
在您的 View 模型中可观察到,例如:
var saveEnabled = ko.observable(false);
context.hasChanges.subscribe(function() { saveEnabled(true); });
然后您可以使用
keyup
Michael 建议的绑定(bind)或添加另一个 subscribe
在您可观察的日期以上 - 并返回调用 valueHasMutated()
在绑定(bind)处理程序中(如果你能找到它)。
关于knockout.js - 强制 knockout 以将可观察对象标记为已更改(即使焦点仍在该字段中),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/16261689/