2013-06-10 3 views
0

В представлении есть заголовок, за которым следует раздел с подменю. дизайн для ViewModels ниже:Как получить экземпляр вложенной модели представления-нокаут

SettingsViewModel = function (pName) { 
    var self = this; 
    self.productName = ko.observable(pName), //heading 
    self.sections = ko.observableArray([ 
      { checkboxID: ko.observable(), checkboxIDState: ko.observable(), sectionname: ko.observable(), sectionState: ko.observable() } 
     ]), //submenus 

    self.Addsections = function (checkboxid, sIdState, sName, sState) { 
     this.sections.push({ checkboxID: checkboxid, checkboxIDState: sIdState, sectionname: sName, sectionState: sState }); 
    } 
}; 


function MainViewModel() { 
    var self = this; 
    self.products = ko.observableArray([]); 
    self.AddProducts= function (pname) { 
     self.products.push(new SettingsViewModel(pname)); 
    } 
}; 


$(document).ready(function() { 
     VM = new MainViewModel(); 
     ko.applyBindings(VM, document.getElementById("divd")); 
    data= []; //some dummy data 
    CallMEnus(data); 

}); 

function CallMEnus(data) { 
     var str = ""; 

     $(data).each(function (index, products) { 
      VM.AddProducts(products.name); 

         $(products.section).each(function (index, section) { 

          var ChkboxId = "data"; 
          var chkboxIdState = 'datt'; 
          var chkboxIdState += " checked"; 
         } 
      //how to call the products add section method? 
          VM.products()[index].Addsections(ChkboxId, chkboxIdState, section.name, section.state); 

         }); 

     }); 

Мне нужно вызвать метод AddSections вложенной SettingsViewModel из экземпляра MainViewModel. Как достичь этого?

Заранее спасибо.

ответ

-1

Я хотел бы использовать EventAggregator разъединить ViewModels, я написал этот легкий EventAggregator

http://jsfiddle.net/wJtun/4/

Подписка:

MyApp.eventAggregator.subscribe(MyApp.DeleteCustomerMessage, this.customerDeleted, this); 

публикации:

MyApp.eventAggregator.publish(new MyApp.DeleteCustomerMessage(this)); 
+0

«Я хотел бы использовать EventAggregator разъединить ViewModels» является идеальным комментарий, но не ответ. Пожалуйста, разверните свой ответ, чтобы указать, как и почему OP должен использовать EventAggregator здесь, а не просто скопировать некоторый пример кода, который вы написали для чего-то другого. – nemesv

1

Ваша проблема этот параметр index из секций шкуры шлейфа index из петли продуктов. Просто используйте другое имя параметра:

function CallMEnus(data) { 
    var str = ""; 

    $(data).each(function (index, products) { 
     VM.AddProducts(products.name); 

     $(products.section).each(function(i, section) { // here 
      var id = "data"; 
      var state = "checked"; 
      VM.products()[index].Addsections(id, state, section.name, section.state); 
     }); 
    }); 
}; 

Fiddle