2012-03-03 11 views
16

mi znalezienie tego dziwne miejsce, aby być w kawałku straty, ale jeśli nie mogę tego zrobić”:Jak można zwiększyć widoczność knockout.js?

koObserv(koObserv() + 1); 

i metoda nie jest, jestem zmuszony do zrobienia:

koObserv = ko.observable(koObserv() + 1) 

To wydaje się naprawdę niezgrabne ... czy jest inny sposób, którego mi brakuje?

+2

Możesz zrobić 'koObserv (koObserv() + 1);'. Czy możesz udostępnić swój kod tam, gdzie to nie działa? Jedynym miejscem, w którym może to powodować problemy, jest to, czy znajduje się w obliczonym obserwowalnym miejscu, w którym może spowodować ponowną ocenę rekurencyjną. –

Odpowiedz

3

Proponuję Ci, jeśli używasz dużo inkrementu, utwórz funkcję pomocnika, aby wykonać inkrement i przekazuj mu odniesienie do obserwowalnego. W efekcie otrzymasz bardziej czytelny kod.

JS:

var increment = function (observable) { 
    observable(observable() + 1); 
}; 

var MyViewModel = function() { 
    this.num1 = ko.observable(0); 

    this.incrementNum = function (observable) { 
     // passing the observable by reference to the helper function 
     increment(observable); 
    } 
} 

HTML:

<button data-bind="click: incrementNum.bind($root, num1)"> 

JSFiddle example

+1

Możesz również dodać funkcję do ['ko.observable.fn'] (http://knockoutjs.com/documentation/fn.html) –

6

można abstrakcyjny nich logika do stopnia, do zaobserwowania

ko.observable.fn.increment = function (value) { 
    this(this() + (value || 1)); 
}; 

var counter = ko.observable(0); 
console.log(counter()); // 0 

counter.increment(); 
console.log(counter()); // 1 

counter.increment(); 
console.log(counter()); // 2 

counter.increment(5); 
console.log(counter()); // 7