2012-11-19 15 views
5

używam foreach na obserwowalnym tablicy:Knockout: Zmiana klasy CSS na podstawie wartości obserwowalne

<div id="mainRight" data-bind="foreach: notifications"> 
    <div class="statusRow"> 
     <div class="leftStatusCell"> 
      <div class="leftStatusCellColor" data-bind="css: availabilityCssClass($data.availability)"></div> 
     </div> 
     <div class="topRightStatusCell" data-bind="text: sip"></div> 
     <div class="bottomtRightStatusCell ellipsisSingleline" data-bind="text: note"></div> 
    </div> 
</div> <!== end mainRight ==> 

Jak widać, mijam wartość bieżącą dostępność do availabilityCssClass funkcyjny, który porównuje wartość niektóre predefiniowane ciągi. W zależności od pasującego ciągu zwraca nazwę klasy.

self.availabilityCssClass = ko.computed(function (value) { 
    var availability = value; 
    if (availability === "Busy" || "DoNotDisturb" || "BeRightBack") 
     return "leftStatusCellColorOrange"; 
    else if (availability === "Away" || "Offline") 
     return "leftStatusCellColorRed"; 
    else 
     return "leftStatusCellColorGreen"; 
}); 

To jest mój model. Dane pochodzą z zewnętrznego źródła danych.

function Notification(root, sip, availability, note) { 
    var self = this; 

    self.sip = ko.observable(sip); 
    self.availability = ko.observable(availability); 
    self.note = ko.observable(note); 
}; 

self.notifications = ko.observableArray(); 

Jednak nie działa tak jak jest. Kiedy funkcja obliczana nie jest komentowana, foreach nie przetwarza danych, a element div jest pusty. Ale widzę, że viewModel nie jest pusty.

+1

Czy możesz podać skrzypce i opisać, co nie działa. –

+0

Którą wersję KO używasz? – nemesv

+0

Im przy użyciu 2.2, więc ta funkcja powinna być obsługiwana, prawda? – mupersan82

Odpowiedz

4

Nie można przekazać wartości do obliczonej w taki sposób. Lepiej jest dodać ten komputerowej do Notification widoku modelu i używać self.availability właściwość:

function Notification(root, sip, availability, note) { 
    var self = this; 

    self.sip = ko.observable(sip); 
    self.availability = ko.observable(availability); 
    self.note = ko.observable(note); 

    self.availabilityCssClass = ko.computed(function() { 
     var availability = self.availability(); 

     if (["Busy", "DoNotDisturb", "BeRightBack"].indexOf(availability) != -1) return "leftStatusCellColorOrange"; 
     else if (["Away", "Offline"].indexOf(availability) != -1) return "leftStatusCellColorRed"; 
     else return "leftStatusCellColorGreen"; 
    }); 
}; 

Twój if oświadczenie nie było prawidłowe, więc naprawiłem logikę. skrzypce tu pracuje: http://jsfiddle.net/vyshniakov/Jk7Fd/

+0

To jest niesamowite, dziękuję! Dlaczego nie mogę przekazać wartości do obliczonej funkcji tak jak ja? A co było nie tak z instrukcją if? – mupersan82

+0

Nie wiem dlaczego, ale przekazywanie wartości do obliczeń nie działa :). W javascript nie można porównywać wartości w taki sposób, w jaki to zrobiłeś. W twoim kodzie pierwsze "jeśli" zawsze zwróci true, gdy dostępność nie jest Zajęta. –

+0

Po prostu zauważyłem, że wartość notatki jest zastępowana za każdym razem, gdy zmienia się dostępność. Jak mogę tego uniknąć? – mupersan82

0

wiążące CSS chce literał obiektu z nazwą klasy CSS jako nazwy elementu oraz wartości prawda lub fałsz depeding na chcesz usunąć lub dodać klasę

data-bind="css: { 'css-class-name': true }" 

edytuj: Hmm, zmienili powiązanie css w 2.2;)

2

Po prostu musisz wykonać funkcję availabilityCssClass. Jak już napisałeś, nie jest to możliwe do obliczenia, ponieważ nie ma widocznych zależności.

self.availabilityCssClass = function (value) { 
    var availability = value; 
    if (availability === "Busy" || "DoNotDisturb" || "BeRightBack") 
     return "leftStatusCellColorOrange"; 
    else if (availability === "Away" || "Offline") 
     return "leftStatusCellColorRed"; 
    else 
     return "leftStatusCellColorGreen"; 
}; 
Powiązane problemy