Принудительно выбить нокаут, чтобы отметить наблюдаемое как измененное (даже если фокус все еще находится в поле)

Я разрабатываю проект с нокаутом / бризом.

Я хотел бы знать, возможно ли принудительное выбивание, чтобы пометить наблюдаемое как измененное (даже если фокус все еще находится в поле). Моя задача состоит в том, чтобы уведомить пользователя о том, что всякий раз, когда он начинает изменять дату, у него есть возможность сохранить его (кнопка отображается сразу). Например, у меня есть поле ввода с датами. Пользователь начинает редактировать дату в этом поле. Наблюдаемое должно интерпретировать только новую закодированную дату, когда пользователь покидает фокус поля. Но я хотел бы показать мой 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.

Надеюсь, кто-то может указать мне в правильном направлении.

Благодарю.

2 ответа

Пытаться observable.valueHasMutated()

РЕДАКТИРОВАТЬ В других комментариях вы упомянули, что вы привязываете свое включенное сохранение к 'context.hasChanges()' (который обновляется из Breeze EntityManager?).

Я считаю, что Бриз не обновляется hasChanges подписавшись на нокаут заметных уведомлений. Я думаю, что он на самом деле оборачивает наблюдаемую функцию установки, а также проверяет, действительно ли значение меняется. Другими словами, я считаю, что на самом деле вам придется изменить значение наблюдаемых (а затем обратно), чтобы вызвать hasChanges(),

Другой (не очень хороший) вариант - попытаться вернуться к родительскому объекту наблюдаемого и получить его. EntityAspect, Затем вы можете вызвать ` setModified ()'. Делать все это в обработчике привязки кажется плохой идеей, поскольку он действительно начинает предполагать, что наблюдаемое, с которым вы связываетесь, является свойством объекта Breeze.

Возможно, вам лучше (без каламбура) рассмотреть вариант, аналогичный ответу Майкла. Возможно создать saveEnabled() Наблюдаемый в вашей viewmodel, как:

var saveEnabled = ko.observable(false);
context.hasChanges.subscribe(function() { saveEnabled(true); });

Затем вы можете использовать keyup обязательный, что Майкл предлагает или добавить другой subscribe выше вашей даты, наблюдаемой - и вернитесь к звонку valueHasMutated() в обработчике привязки (если вы можете его найти).

Предполагая, что ваша кнопка сохранения уже имеет enable привязка привязана к наблюдаемой, давайте назовем это saveEnabled, вы должны иметь возможность вызвать его с помощью обработчика событий. Нокаут включает в себя event обязательна только для этого.

<input type="text" data-bind="dateRW: myDate, event: {keyup: function() {saveEnabled(true);}}">

Другие вопросы по тегам