2013-09-16 3 views
0

У меня есть этот кодKnockoutJS - Получение данных ViewModel от вложенного объекта

$(document).ready(function() 
{ 
    "use strict"; 

    function ObjectB(data) 
    { 
     /* I WANT TO ACCESS foo HERE */ 
    } 

    function ObjectA(data) 
    { 
     var mappedObjectBs = []; 

     this.ObjectBs = ko.observableArray([]); 
     mappedObjectBs = $.map(data.ObjectBs, function(item) { 
      return new ObjectB(item); 
     }); 
     this.ObjectBs(mappedObjectBs); 
    } 

    function SampleViewModel() 
    { 
     var self = this; 
     self.ObjectAs = ko.observableArray([]); 

     $.getJSON('data/foo.json', function(foo) { 

      /* foo IS AVAILABLE HERE */ 

      $.getJSON('data/bar.json', function(bar) { 
       var mappedObjectAs = []; 
       mappedObjectAs = $.map(bar, function(item) { 
        return new mappedObjectAs(item); 
       }); 
       self.ObjectAs(mappedObjectAs); 
      }); 
     }); 
    } 

    ko.applyBindings(new SampleViewModel()); 
}); 

То, что я хочу сделать здесь, чтобы получить доступ к foo внутри ObjectB.

Есть ли способ сделать это?

Причина, по которой я пошел с этим типом решения, состоит в том, что я не хочу, чтобы объекты ObjectB выполняли избыточные вызовы JSON.

ответ

1

Почему бы не передать ссылку родительского объекта в дочерний объект? Что-то вроде этого:

function ObjectB(data, root) { 
    this.root = root; 

    alert(this.root.someProperty); 
} 

function ObjectA(item, root) { 
    var mappedObjectBs = []; 

    mappedObjectBs.push(new ObjectB(item, root)); 

    this.ObjectBs(mappedObjectBs); 
} 

function SampleViewModel() { 
    this.someProperty = true; 

    //Inside your ajax call 
    new ObjectA(item, this); 
} 
+0

Я думал, что существует более элегантный способ доступа к «root». Но это работает как минимум. – arvinsim

Смежные вопросы