Подписка на значения из другой модели представления в нокауте js

Я пытаюсь разделить свои модели представлений на несколько повторно используемых моделей представлений. У меня есть одна модель представления, которая содержит несколько раскрывающихся списков и одну кнопку.

    var TopView = function () {
       self.DropDownA = ko.observableArray();
       self.selectedDDA = ko.observable();
       self.DropDownB = ko.observableArray();
       self.selectedDDB = ko.observable();

       $.getJSON("someAPIurl", function (result) {
            ko.mapping.fromJS(result, {}, self);
        });  //this builds dropdownA

        $self.selectedDDA.subscribe(function(newValue) {
            $.getJSON("anotherAPI"+newValue, function (result) {
                ko.mapping.fromJS(result, {}, self);

            });
        };  // this builds dropdownB
        $self.buttonClicked = function() {
            alert("I clicked!");
        }
}

Моя основная модель просмотра выглядит так:

var MainView = function () {
   var self = this;
   var topView = ko.observable({ TopView: new TopView() });

   // How do i get the selected values from topView once the user clicks the button???
}

Как мне подписаться на выбранные значения DropDownA и DropDownB из моего основного представления??? Пожалуйста помоги! Благодарю вас!


person user1175857    schedule 11.02.2013    source источник
comment
Вы понимаете, что используете self в конструкторе TopView, не присваивая его заранее this?   -  person Fabian Schmengler    schedule 11.02.2013


Ответы (1)


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

<button data-bind="click:topView.buttonClicked">click me, I&#39;m a button!</button>

TopView остается прежним (после того, как вы исправили использование self и $self без их определения)

MainView будет выглядеть следующим образом:

var MainView = function () {
   var self = this;
   self.topView = new TopView();
}

пример JSFiddle

person Fabian Schmengler    schedule 11.02.2013