ko.subscribe на свойства дочерней модели - PullRequest
8 голосов
/ 09 февраля 2012

Ищите хороший пример того, как настроить дочерние модели в knockoutjs. Это включает в себя привязку к дочерним событиям, таким как обновления свойств, которые я пока не смог заставить работать.

Кроме того, в этом случае было бы лучше привязать к одному дочернему элементу, а не к массиву, но я не знаю, как настроить его в HTML без шаблона foreach.

http://jsfiddle.net/mathewvance/mfYNq/

Спасибо.

<div class="editor-row">
    <label>Price</label>
    <input name="Price" data-bind="value: price"/>
</div>

 <div class="editor-row">
    <label>Child</label>
    <div data-bind="foreach: childObjects"> 
        <div><input type="checkbox" data-bind="checked: yearRound" /> Year Round</div>
        <div><input type="checkbox" data-bind="checked: fromNow" /> From Now</div>
        <div>
            <input data-bind="value: startDate" class="date-picker"/> to 
            <input data-bind="value: endDate" class="date-picker"/>
        </div>
    </div>
</div>
var ChildModel= function (yearRound, fromNow, startDate, endDate) {
    var self = this;

    this.yearRound = ko.observable(yearRound);
    this.fromNow = ko.observable(fromNow);
    this.startDate = ko.observable(startDate);
    this.endDate = ko.observable(endDate);

    this.yearRound.subscribe = function (val) {
        alert('message from child model property subscribe\n\nwhy does this only happen once?');

        //if(val){
        //    self.startDate('undefined');
        //    self.endDate('undefined');
        //}
    };
}

var ParentModel = function () {
    var self = this;

    this.price = ko.observable(1.99);
    this.childObjects = ko.observableArray([ new ChildModel(true, false) ]);
};

var viewModel = new ParentModel ();
ko.applyBindings(viewModel);

1 Ответ

4 голосов
/ 09 февраля 2012

Попробуйте со следующим:

this.yearRound.subscribe(function (val) {
        alert('value change');
    });

Если вы хотите, чтобы абонент загружался и во время загрузки страницы, сделайте что-то вроде этого:

var ChildModel= function (yearRound, fromNow, startDate, endDate) {
    var self = this;

    this.yearRound = ko.observable();
    this.fromNow = ko.observable(fromNow);
    this.startDate = ko.observable(startDate);
    this.endDate = ko.observable(endDate);

    this.yearRound.subscribe(function (val) {
        alert('value change');
    });
    this.yearRound(yearRound);
}

http://jsfiddle.net/azQxx/1/ - это работает для меня с Chrome 16 и Firefox 10

Каждый раз, когда проверенная кнопка меняет свое значение, срабатывает обратный вызов.

На мой взгляд, observableArray - это хорошо, если с родителем может быть связано несколько дочерних моделей.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...