2016-11-08 9 views
0

Here - это код плункера, над которым я работаю. Я определил виртуальную машину, которая выглядит так.

var employee = function(fname,lname){ 
    var self= this; 
    self.fname = ko.observable(fname); 
    self.lname = ko.observable(lname); 
    self.selectedElement = ko.observable('Default Value'); 
    } 

    var vm = function(){ 
     var self = this; 
     self.employees = new ko.observableArray([]); 
     self.selectedElement = ko.observable(-1); 

     var e1 = new employee('f1','l1'); 
     var e2 = new employee('f2','l2'); 
     self.employees.push(e1); 
     self.employees.push(e2); 
    }; 

    ko.applyBindings(vm,container); 

И мой код, чтобы отобразить список работников

<body id="container"> 
<h1>Empoyees</h1> 
<div> 
    <div data-bind="foreach: employees"> 
    <h4 data-bind="text: 'Employee' + $index()"></h4> 
    <span>First Name :</span> 
    <span data-bind="text: fname"></span> 
    <br/> 

    <span>Last Name :</span> 
    <span data-bind="text: fname"></span> 
    <br/> 

    <span data-bind="text: selectedElement()"></span> 
    <!-- I want to access parents 'selectedElement' i.e. vm.slectedElement() --> 
    <!--I tried below code but its causing binding error.--> 
    <!-- <span data-bind="text: $parent.selectedElement()"></span> --> 
    <br/> 
    </div> 
</div> 

Обратите внимание, что девка «employee» и основной вид модели «vm» и имеет идентичный свойство с именем (selectedElement)

Теперь внутри foreach binding Я пытаюсь получить доступ к свойству «selectedElement» корневого/родительского контекста, но поскольку я внутри foreach, ko обращается к свойству «selectedElement» класса «employee».

Я попытался использовать $root и $parent ключевые слова, чтобы получить свойство родительского элемента, но вызывает ошибку привязки.

Я ничего не пропустил? Here - ссылка на плункер.

ответ

3

Вы никогда не создавали экземпляр модели корневого представления. Изменение первоначального вызова

ko.applyBindings(new vm(),container); 

https://plnkr.co/edit/wRKfnJi9Jl9Rj2unbgQp?p=preview

Когда вы сделаете это, либо $root или $parent будет работать, как ожидалось.

+0

Спасибо @Jamiec за быстрый ответ. Но все же я почесываю голову, потому что все остальное (кроме $ root/$ parent) работало без экземпляра объекта моей модели представления. Может быть, я не знаю основ. Не могли бы вы рассказать об этом? – user2243747

+1

@ user2243747 нокаут будет принимать прямую функцию в качестве модели представления, но, вероятно, «это» относится к объекту окна, когда вы это делаете. Это смущает иерархию моделей представления времени выполнения, поэтому такие вещи, как '$ root' и' $ parent', вероятно, указывают на неправильное место. – Jamiec