2016-11-08 158 views
0

Here是我正在研究的一个plunker代码。我已经定义了一个看起来像这样的虚拟机。

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绑定我试图访问根/父上下文的'selectedElement'属性,但因为我在foreach中,因此ko正在访问'employee'类的'selectedElement'属性。

我尝试使用$root$parent关键字来达到父元素属性,但它导致绑定错误。

我错过了什么? Here再次是plunker链接。

回答

3

您从未创建过根视图模型的实例。最初的电话更改为

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

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

当你做到这一点,无论是$root$parent将正常工作。

+0

感谢@Jamiec作出快速响应。但是,我还在摸索为什么其他所有东西(除了$ root/$ parent)都没有实例化我的视图模型的对象。可能是我不知道的基础知识。你能把这个问题点亮吗? – user2243747

+1

@ user2243747 knockout将接受一个直观的函数作为视图模型,但当你这样做时,可能'this'指的是窗口对象。它会混淆视图模型的运行时层次结构,所以'$ root'和'$ parent'可能指向错误的地方。 – Jamiec