2014-01-29 107 views
0

我無法弄清楚如何獲取綁定項目的屬性。當.name()在那裏時,以下不起作用。如何使用Knockout訪問綁定對象實例的屬性

<span data-bind='text: selectedMenuSection().name()'></span> 

似乎您無法訪問數據綁定中綁定對象的屬性。相同的語法在模型函數MenuViewModel.showSelection()中起作用。我嘗試了所有可能的語法,但都沒有成功。以下是我的代碼摘錄。

的Html

MenuSections: <select data-bind="options: leftMenu, optionsText: 'name', value: selectedMenuSection, optionsCaption: 'Pick...'"> </select> 

Selected: <span data-bind='text: selectedMenuSection().name()'></span> 

<button data-bind="click: showSelection">Show Selected Info</button> 

的JavaScript

function MenuViewModel (menu) { 
    var self = this; 
    self.leftMenu = ko.observableArray(menu); 

    //Bound to Select 
    self.selectedMenuSection = ko.observable(); 

    self.showSelection = function(){ 
    alert(self.selectedMenuSection().name()); 
    }; 
}; 

是沒可能得到一個數據綁定對象屬性或有我只是沒有想出怎麼辦呢?

回答

0

你可以嘗試以下方法:

<span data-bind="with: selectedMenuSection"> 
    <span data-bind="text: name"></span> 
</span> 

第一行確保內寬度只存在,如果selectedMenuSection不爲空或未定義(當您創建self.selectedMenuSection,它的價值是不確定這會導致嘗試訪問name屬性時出錯)。第二行是你原來的裝訂。最後你不需要(),因爲你綁定了observable(你只需要()來訪問observable的當前值,或者如果你綁定一個複雜的語句而不是直接指向observable)。

+0

這樣做的工作,但我現在可以讓我的代碼工作,這一切都讓我對Knockout和它如何工作更多思考。我發現我的代碼工作,如果我把以下self.selectedMenuSection = ko.observable(菜單[0]);在但不起作用,如果我這樣做self.selectedMenuSection = ko.observable(self.leftMenu [0]); – Mikee

+0

這是因爲self.leftMenu是一個observable(數組),你想要的是底層的值:self.leftMenu()[0]。通過淘汰賽,最重要的訣竅就是要知道什麼時候需要可觀測數據,何時需要數據。 –

0

MenuSection是什麼樣的?我假設它有一個不是可觀察的名稱屬性。漢斯的回答是解決你的問題的正確方法。理解javascript對象並理解你在編寫敲除html時所處的「背景」是非常重要的。

with with binding將上下文從根元素(您傳遞到您的ko.applyBindings中的對象)更改爲selectedMenuSection的上下文。因此,'與'你的上下文(所有情況下的$數據)是一個MenuSection。如果您是每一個好奇的是在上下文是什麼對象,你可以做這樣的事情:

<div data-bind="with: selectMenuSection"> 
     <pre data-bind="text: ko.toJSON($data)></pre> 
     <span data-bind="text: name"></span> 
    </div> 

這將打印出來,你是在當前對象上下文然後,您就可以看到你有一個'name'屬性可用於您和任何其他附加到MenuSection的屬性。

+0

是的馬修,MenuSection有一個名稱屬性,但它是可觀察的。感謝後續......我很好奇。 @Hans聲明'最大的訣竅就是要知道什麼時候你需要這些可觀察的東西,而當你需要這個價值時'也讓我更加好奇。 – Mikee

+0

在綁定中,如果您只是使用該值,則不需要訪問該值(例如:data-bind ='visible:isVisible')。但是如果你正在做任何計算,你需要指定你想要的值(例如:data-bind ='visible:isVisible()|| isAdmin()') 希望有所幫助。 – Matthew