Knockout v.3: Подписка на наблюдаемое на глобальном уровне, содержащее объект

У меня возникают проблемы с обновлением подписки на объект, когда обновляются какие-либо наблюдаемые объекты.

Вот модель, с которой я работаю:

searchModel = function (startDate, endDate, searchTerm) {
var self = this;
self.StartDate = ko.observable(startDate);
self.EndDate = ko.observable(endDate);
self.SearchTerm = ko.observable(searchTerm);
};

Вот обработчик привязки, который я использую для обновления наблюдаемых для datepicker:

ko.bindingHandlers.datepicker = {
    init: function (element, valueAccessor, allBindingsAccessor) {
        //initialize datepicker with some optional options
        var options = allBindingsAccessor().datepickerOptions || {};
        $(element).datepicker(options).on("changeDate", function (ev) {
            var observable = valueAccessor();
            observable(ev.date);
        });
    },
    update: function (element, valueAccessor) {
        var value = ko.utils.unwrapObservable(valueAccessor());
        $(element).datepicker("setValue", value);
    }
};

Это функция-расширитель, которую я использую для инициализации и подписки на модель поиска:

ko.extenders.getEvents = (function (target, options) {
    function getEvents(target) {
        console.log(target);
    };

    getEvents(target());
    target.subscribe(getEvents);

    return target;
});

Любая помощь будет принята с благодарностью ... Короче говоря, я хотел бы, чтобы страница инициализировалась с помощью наблюдаемых значений модели по умолчанию (ниже), и всякий раз, когда какой-либо из наблюдаемых в объекте обновляется, срабатывает подписка, чтобы я мог «делать что-то».

this.SearchCriteria = ko.observable(new searchModel('', '', '')).extend({
    getEvents: null
});

Вот с чем я работаю: JSFiddle


person Sneaky McSneakerson    schedule 11.07.2014    source источник
comment
Мне кажется, что основная проблема в том, что событие changeDate не запускается.   -  person xdumaine    schedule 12.07.2014


Ответы (1)


Ваш bindingHandler не обрабатывает событие «changeDate». Это происходит в файле $ (document) .ready.

Не уверен, что это то, что вы ищете, но я бы немного изменил его. Я бы привязал нокаут к searchModel и переместил bindingHandler. Затем вы можете «делать что-нибудь» с помощью функции searchModel.

ko.bindingHandlers.datepicker = {
    init: function(element, valueAccessor, allBindingsAccessor) {
        var options = allBindingsAccessor() || {};
        $(element).datepicker(options).on("changeDate", function(ev) {
            var observable = valueAccessor();
            observable(ev.date);
        });
    },
    update: function(element, valueAccessor) {
        var value = ko.utils.unwrapObservable(valueAccessor());
        $(element).datepicker("setValue", value);
    }
};

var searchModel = function() {
    var self = this;
    self.startDate = ko.observable();
    self.endDate = ko.observable();
    self.searchTerm = ko.observable();
};

var search = new searchModel();
ko.applyBindings(search);

$('#datepicker1').datepicker();
$('#datepicker2').datepicker(); 

http://jsfiddle.net/J8LCJ/1/

person avaholic    schedule 11.07.2014
comment
в подобном вопросе были высказаны какие-либо мысли по этому поводу: stackoverflow.com/questions/24224256/. ура Спасибо - person super cool; 12.07.2014
comment
Спасибо, это то, что я искал! - person Sneaky McSneakerson; 24.07.2014