2013-06-18 17 views
7

Mam na mojej stronie viewModel, który przechowuje dane do przeglądu bieżących stanów niektórych urządzeń. Do tej pory wszystko działa świetnie, z wyjątkiem jednego problemu: muszę ustawić atrybut title elementu div w zależności od innej wartości w moim widokuModelu.Knockout.js: warunkowo wiążą atrybut title of div

wiem, że można po prostu ustawić atrybut title tak (w atrybucie danych wiążą znacznika div):

attr: { title: 'Some title' } 

Korzystanie powyżej oświadczenie: „Niektórzy tytuł” ​​zostanie ustawiony jako podpowiedzi, gdy unosząc div. mogę też ustawić:

attr: { title: ConnectState.Value() } 

i wyprowadza poprawną wartość (wartość całkowita) moich danych bieżących ViewModel tak ViewModel zostanie wypełniona prawidłowo.

Teraz trzeba zmienić czegoś tak:

attr: { 
    title: { 
    'Text 1': ConnectState.Value() == 0, 
    'Text 2': ConnectState.Value() == 1, 
    'Text 3': ConnectState.Value() == 2, 
    'Text 4': ConnectState.Value() == 3 
    } 
} 

Powyższy przykład tylko dać „[Object o]” jak tytuł (odpowiednio jak podpowiedzi.). Jak mogę to naprawić? Bardzo dziękuję z góry!

+1

Dlaczego nie piszesz 'attr: {title: 'Tekst' + (ConnectState.Value() + 1)}' albo rzeczywisty tekst jest bardziej skomplikowany niż twój przykład? – nemesv

+0

Niestety tak jest. Wartość ConnectState to wyliczenie, które oznacza "połączony", "odłączony", "łączący" itp. – Robert

Odpowiedz

9

Zdefiniuj ko.computed w swoim viewmodelu.

self.ConnectTitle = ko.computed(function() { 
    return 'Text ' + (self.ConnectState.Value() + 1).toString(); 
}); 

Następnie: -

attr: { title: ConnectTitle } 

Jako Twój wiążące. Możesz zastąpić zawartość funkcji obliczeniowej czymś, co będzie pasować do twoich potrzeb, jeśli twój tekst był tylko prostym przykładem.

+0

Dzięki za sugestię. Atrybut tytułu, który muszę ustawić, istnieje w wierszu tabeli związanym z danymi: Tak więc muszę zastosować tę funkcję ConnectTitle do każdego elementu w mojej kolekcji "Rzędy" viewModels, która jest dynamicznie , w zależności od strony. Nie mogłem wymyślić, jak to osiągnąć. – Robert

+1

Każdy z twoich wierszy jest reprezentowany przez obiekt, prawda? Opublikuj swój model widoku JavaScript, a my zajrzymy. –

+0

Oto zrzut Json typowych danych viewModel: http://jsfiddle.net/AMLk7/ – Robert

2

Można użyć potrójny operatora, coś takiego:

attr: { 
    title: ConnectState.Value() == 0 ? 'Text 1' : 
     ConnectState.Value() == 1 ? 'Text 2' : 
     ConnectState.Value() == 2 ? 'Text 3' : 
     'Text 4' 
} 
Powiązane problemy