我用淘汰/微风开发了一个项目。
我想知道是否有可能强制淘汰赛将观察者标记为已更改(即使焦点仍在场中)。我的goad是通知用户,无论何时他开始更改日期,他都能够保存它(立即显示一个按钮)。例如,我有一个带日期的输入字段。用户开始在此字段中编辑日期。只有当用户离开该字段的焦点时,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。
希望有人能指出我正确的方向。
感谢。
答案 0 :(得分:9)
尝试observable.valueHasMutated()
修改强> 在其他评论中,您提到您将保存启用绑定到'context.hasChanges()'(从Breeze EntityManager更新?)。
我相信Breeze不会通过订阅Knockout可观察通知来更新hasChanges
。我认为它实际上包装了可观察的设置功能,并检查以确保该值实际发生变化。换句话说,我相信您实际上必须更改您的observables值(然后返回)以触发hasChanges()
。
另一个(不那么好)选项可能是尝试返回observable的父对象并获取它EntityAspect
。然后你可以调用“setModified()”。在绑定处理程序中执行所有这些操作似乎是一个坏主意,因为它真的开始假设您绑定的可观察对象是Breeze实体上的属性。
你可能最好(没有双关语)考虑类似迈克尔答案的选项。也许在您的viewmodel中创建一个saveEnabled()
observable,如:
var saveEnabled = ko.observable(false);
context.hasChanges.subscribe(function() { saveEnabled(true); });
然后,您可以使用Michael建议的keyup
绑定,或者在您的日期可观察日期上添加另一个subscribe
- 然后返回到绑定处理程序中调用valueHasMutated()
(如果可以的话)找到它。)
答案 1 :(得分:0)
假设您的保存按钮已将enable
绑定绑定到一个observable,让我们称之为saveEnabled
,您应该能够使用事件处理程序触发它。 Knockout仅包含event
绑定。
<input type="text" data-bind="dateRW: myDate, event: {keyup: function() {saveEnabled(true);}}">