2012-04-20 14 views
12

Używając KnockoutJS, jak mogę usunąć element z tablicy obserwowalnej? Chcę móc kliknąć na liście i usunąć element z tablicy (a tym samym z listy).KnockoutJS usuwa element z obserwowalnej tablicy. Pozycja jest listitem w ul, który został wygenerowany przez foreach

Poniższy przykładowy kod raportu zgłasza: "this.expertise is undefined".

Czy muszę zdefiniować jakiś obiekt ekspertyzy, a następnie wywołać go z tego miejsca?

<ul data-bind="foreach: expertise"> 
    <li data-bind="text: Key, click: $parent.removeExpertise"></li> 
</ul> 

<script type="text/javascript"> 
    $(function() { 
     function AppViewModel() { 

      this.removeExpertise = function (expertise) { 
       this.expertise.remove(expertise); 

      }; 

      this.expertise = ko.observable([ 
       { Key: 'Charles', Value: 'Charlesforth' }, 
       { Key: 'Denise', Value: 'Dentiste' } 
      ]); 
     } 

     // Activates knockout.js 
     jQuery(document).ready(function() { 
      ko.applyBindings(new AppViewModel()); 
     }); 
    }); 
</script> 

Odpowiedz

17

Kiedy wywołać metodę z dzieckiem, this zostanie ustawiony na dziecko zamiast $parent.

Istnieje wiele sposobów zapewnienia, że ​​removeExpertise jest wywoływana z odpowiednią wartością dla this. Łatwym sposobem jest użycie .bind.

to będzie wyglądać:

this.removeExpertise = function (expertise) { 
    this.expertise.remove(expertise); 
}.bind(this); 

Ponadto, będziemy chcieli expertise być observableArray raczej niż observable, jako observableArray naraża metod manipulacji tablicą tym remove funkcji.

+1

co robi plik .bind? Słowo bind jest po ich dokumentach, więc mogę go nie zauważyć – Hoppe

+2

.bind zwraca nową funkcję, która owija pierwotną funkcję i wywołuje ją ze stałą wartością "this". W tym przypadku chcesz, aby zawsze używał instancji 'AppViewModel' jako' this'. Mam nadzieję, że ma to sens. –

+2

To byłoby miłe: viewModel.items.remove ("id", 1); viewModel.items.remove ("name", "Jim"); viewModel.items.remove (someObject); – jwize

Powiązane problemy