0

<li>私はそれらのいくつかが通常の状態にあり、いくつかの部分が強調表示された状態にある(「hasNews」クラスを持っている)多くの要素を持っています:

<ul class="companies">
    @foreach (var item in Model)
      {
        <li id='company_@(item.Id)' data-id='@item.Id' @{if (item.hasNews) { <text>class="hasNews"</text>} } >
                  <a>@item.Name</a>
        </li>
      }
</ul>

いずれかをクリックしたときに<li>、そのIDをコントローラーに送信し、その会社を既読として設定し、コールバックがtrueの場合は、その会社から「hasNews」クラスを削除したいと思います<li>。これを行うためのメソッドがコントローラーにあります。<li>しかし、コールバックがtrueの場合、クリックされたアイテムから「hasNews」クラスを削除するには、jqueryのヘルプが必要です。次のコードを使用して、コントローラーにリクエストを送信し、操作を実行して、falseまたはtrueを返します。しかし、その<li>項目はまだ強調表示されています:

$('.companies li ').click(function (e) {
    url = '@Url.Action("SetCompanyNewsAsRead", "Company")';
    var data = { id: $(this).attr('data-id') };
    $.post(url, data, function (result) {
      if (result.success) {

      $(this).removeClass('hasNews');  //this does not remove "hasNews" class.

     }
   });
});

この問題を解決するにはどうすればよいですか?

編集: 追加したい:<li>アイテムの1つは「現在」です。私はこれをしました:

$('#company_' + currentItemId).addClass('current');

この作品。これにより、「hasNews」クラスの削除を防ぐことができますか?

4

1 に答える 1

4

問題はthis、内部(コールバック)関数が外部関数と同じではないことthisです。関数の呼び出し方法に応じて設定され、含まれている関数から確実に継承されません。それへの参照を外部関数の変数に保存すると、内部関数がそれにアクセスできるようになります。

$('.companies li ').click(function (e) {
    url = '@Url.Action("SetCompanyNewsAsRead", "Company")';
    var theLI = this,   // <--------- Save reference to this
        data = { id: $(this).attr('data-id') };
    $.post(url, data, function (result) {
      if (result.success) {

        $(theLI).removeClass('hasNews');  //this does not remove "hasNews" class.

     }
   });
});

thisJavaScriptでの動作の詳細については、 MDNを参照してください。

編集:あなたの編集に答えるために、いいえ、他のクラスの存在は違いを生まないはずです。

于 2013-02-15T08:41:24.747 に答える