2016-11-08 70 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

相關問題