2013-06-02 10 views
18

mam super prosty kod nokaut poniżej:Knockout.js Jak uzyskać dostęp do właściwości obiektu na wewnętrznej-danych wiążą

var data ={ 
    "Id" : 1001, 
    "SalePrice" : 12345, 
    "ListPrice" : 333, 
    "ShortDesc" : "Tayler 12345E", 
    "Description" : " Long Description" 
}; 


var viewModel={ 
    dataTest: ko.observable(data) 
}; 


ko.applyBindings(viewModel); 

<span data-bind="text: dataTest.SalePrice"></span> 

Zasadniczo mam przeszedł cały obiekt danych rzeczowe obserwowalnym dataTest. Uznałbym, że łatwo jest uzyskać dostęp do właściwości obiektu wewnętrznego z notacją kropkową. Ale nie jest.

Czy ktoś mógłby pomóc, aby powyższy kod zadziałał?

Odpowiedz

28

Jest obecnie zaobserwować (czyli jest to funkcja). Musisz zadzwonić do tej funkcji.

<span data-bind="text: dataTest().SalePrice"></span> 

Editing Akshat's fiddle to match.

Nie wiadomo, dlaczego jest to przewaga nad zagnieżdżeniem odpowiedniej hierarchii. To, o co prosi OP, to dość anty-wzór. Sądzę, że warto przejrzeć ponad the page on binding context Akshat suggests, aby zobaczyć, jak utworzyć obiekt dataTest jako obiekt nadrzędny, a następnie przejść do znaczników.

+0

Fajny połów o obserwowalnym. –

+0

dziękuję za odpowiedź, czy możliwe jest przechodzenie przez obiekt "danych" w celu uzyskania dostępu do wszystkich właściwości jednocześnie? – johannesMatevosyan

+0

@stratovarius To prawdopodobnie nowe pytanie. Nie jestem do końca pewien, o co pytasz w tym kontekście, ponieważ 'SalePrice' jest pojedynczą int. Jeśli masz na myśli, czy możesz pobrać wszystko z 'dataTest()', z pewnością możesz. Ale robienie tego w ramach jednego związanego obiektu, takiego jak ten tutaj, nie ma większego sensu. Ale może [chcesz obliczyć możliwe do obliczenia] (http://knockoutjs.com/documentation/computedObservables.html)? Trudno powiedzieć - poszukaj SO z podobnym pytaniem, o które pytasz, a jeśli nic nie wyskoczy, możesz poprosić o nowe! – ruffin

2

Zapoznaj się z fiddle .Wszystkie trzeba zrobić to

<span data-bind="text: salePrice "></span> 

Ten element będzie zapełnić zakresowego ceny sprzedaży określonej w modelu widoku.

Z twojego pytania wydaje mi się, że to, co próbujesz zrobić, wiąże model widoku z różnymi elementami strony html. Aby to osiągnąć, można przekazać parametr id do powiązania stosowanego w celu powiązania określonego modelu widoku z określoną sekcją strony. Podoba Ci się to

ko.applyBindings(viewmodel,document.getElementById('id')); 

Jeśli szukasz bezpośredni dostęp model widok użyć binding context. W tym przypadku potrzebne są $data wiążące context.So wiązanie w rozpiętości zmieni się

<span data-bind="text:$data.salePrice"></span> 
+0

Wiem, że można to zrobić bezpośrednio. Ale próbuję uzyskać dostęp do obiektu, który jest przypisany do właściwości viewModel. –

+0

To jest bardzo długi proces, kiedy naprawdę mamy pozwolenie na dostęp przez łańcuch. – Chakri

0

Jeśli strona jest tylko do odczytu, a model widoku nie ulegnie zmianie (tak jak w moim przypadku), nie jest konieczne obserwowanie.

Można także prace przykładowy kod w ten sposób:

var viewModel={ 
    dataTest: data 
}; 

Następnie można uzyskać dostęp do właściwości w wiązaniu z prostego zapisu danych dot.

<span data-bind="text: dataTest.SalePrice"></span> 

Korzystanie z kontekstu lub with wiązania nie jest pożądane, ponieważ w moim przypadku musiałbym ciągle przełączać się między 2 obiektów w tabeli porównawczej.

+0

Program operacyjny nie określa, czy konieczne jest dwukierunkowe powiązanie danych, więc jest to kolejna odpowiedź na to pytanie. Mam nadzieję, że pomoże to komuś innemu. – Jess

0

Wezwanie do ko.observable musi być przeniesiona z MVVM do elementu HTML:

var data ={ 
    "Id" : 1001, 
    "SalePrice" : 12345, 
    "ListPrice" : 333, 
    "ShortDesc" : "Tayler 12345E", 
    "Description" : " Long Description" 
}; 


var viewModel={ 
    dataTest: data 
}; 


ko.applyBindings(viewModel); 

<span data-bind="text: ko.observable(dataTest.SalePrice)"></span> 
Powiązane problemy