2012-04-20 739 views
12

Usando KnockoutJS, ¿cómo puedo eliminar un elemento de una matriz observable? Quiero poder hacer clic en el elemento de lista y eliminar el elemento de la matriz (y, por lo tanto, la lista).KnockoutJS eliminar el elemento de la matriz observable. El elemento es listitem dentro de ul, que fue generado por foreach

El siguiente ejemplo de código informa: 'this.expertise no está definido'.

¿Tengo que definir algún tipo de objeto de experiencia y luego llamar desde allí?

<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> 

Respuesta

17

Cuando se llama a un método en el niño, this se establecerá en el niño en lugar de $parent.

Hay muchas maneras de asegurarse de que se llame a removeExpertise con el valor apropiado para this. Una manera fácil es usar .bind.

que se vería así:

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

Además, tendrá que ser un expertiseobservableArray en lugar de un observable, como observableArray expone los métodos de manipulación de matrices que incluyen una función remove.

+1

¿Qué hace el .bind? La palabra bind está en todos sus documentos, por lo que puede estar pasando por alto – Hoppe

+2

.bind devuelve una nueva función que envuelve la función original y la llama con un valor constante para "this". En este caso, desea que siempre use la instancia de 'AppViewModel' como' this'. Espero que tenga sentido. –

+2

esto sería bueno: viewModel.items.remove ("id", 1); viewModel.items.remove ("nombre", "Jim"); viewModel.items.remove (someObject); – jwize

Cuestiones relacionadas