2012-04-20 8 views
12

KnockoutJSを使用すると、観測可能な配列からアイテムを削除するにはどうすればよいですか?私はlistitemをクリックして、配列(そしてそれによってリスト)から項目を削除したいと思っています。KnockoutJSは観測可能な配列から項目を削除します。アイテムはforeachによって生成されたul内のlistitemです

以下のコードサンプルは、 'this.expertise is undefined'と報告しています。

何らかの種類の専門知識オブジェクトを定義し、そこから呼び出す必要がありますか?

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

答えて

17

あなたは子供からメソッドを呼び出すと、thisではなく$parentより子に設定されます。

removeExpertisethisに適切な値で呼び出されるようにする方法はたくさんあります。簡単な方法は.bindを使用することです。

それは次のようになります。observableArrayremove機能を含む配列操作方法を公開しても、あなたは、expertiseobservableArrayいうよりobservableになりたいでしょう

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

+1

.bindは何をしますか?バインドという言葉はすべて文書の上にありますので、私はそれを見落としている可能性があります – Hoppe

+2

.bindは元の関数をラップする新しい関数を返し、 "this"の一貫した値で呼び出します。この場合、常に 'this'として' AppViewModel'のインスタンスを使用したいとします。希望は意味をなさない。 –

+2

これはいいでしょう: viewModel.items.remove( "id"、1); viewModel.items.remove( "name"、 "Jim"); viewModel.items.remove(someObject); – jwize

関連する問題