Blazor上的Bootstrap模態(tài)已停止工作。NET 8 RC2(使用JSInterop打開/關(guān)閉)

我相信我所做的是反對dotnet-8-Blazor-way做事,但我無論如何都會發(fā)帖,因為我覺得如果有更多的人在.NET 7之前做過我所做過的事情,這對他們來說會很有用。

目前(在.NET 8 RC1之前),我有一個頁面,其中必須從C#打開bootstrap模態(tài)。為此,我在JS文件上添加了兩個方法(openPOModal、closePOModal),并使用JSInterop從C#調(diào)用它們:

JS:

var selectPOModal = new bootstrap.Modal('#selectPOModal', {
});

var closePOModal = () => {
    selectPOModal.hide();
}

var openPOModal = () => {
    selectPOModal.show();
}

export { closePOModal, openPOModal };

Razor component:

@code {
    protected override async Task OnAfterRenderAsync(bool firstRender)
    {
        if (firstRender)
        {
            jsModule = await JS.InvokeAsync<IJSObjectReference>(
                "import", "./Pages/MyComponent.razor.js");
        }
    }

    ...
    private async Task SomethingHappensNeedOpenModal()
    {
        await jsModule.InvokeVoidAsync("openPOModal");
    }
}

即使在.NET 8 RC2中,模態(tài)也會打開,但模態(tài)中所有Blazor控制的元素都不再響應(yīng)。

我在模態(tài)中有一個綁定到屬性的輸入,它不再更新。也不是我調(diào)用C#方法的按鈕。

我的問題是:有沒有一種簡單的方法可以使用JS再次實現(xiàn)這一點?

或者,使用Blazor實現(xiàn)bootstrap's打開/關(guān)閉邏輯的正確解決方案是這個鏈接問題的答案中所做的嗎?

? 最佳回答:

我在Blazor.NET 8 RC2(服務(wù)器)中處理此問題的方法是向窗口添加一個可以通過JS interop調(diào)用的函數(shù)。

首先,在加載時運行的JS文件中創(chuàng)建函數(shù)(在本例中使用IIFE)。

my-bootstrap.js

(function() {
  // use a custom namespace to avoid polluting the window object
  window.myNamespace = {
    bootstrap: {
      modals: {
        show: el => {
          // I will be passing in the element itself, 
          // but the selector could also be used
          const instance = bootstrap.Modal.getOrCreateInstance(el);
          instance.show();
        }
      }
    }
  };
})();

創(chuàng)建包含模態(tài)和事件處理程序的剃刀組件,以通過IJSRuntime顯示模態(tài)。在這種情況下,我使用的是按鈕點擊。

my-modal.razor

<button @onclick="@OnButtonClick">Show modal</button>

<div class="modal" tabindex="-1" @ref="@ModalElement">
    <!-- modal example omitted for brevity, 
         available from the Bootstrap docs -->
</div>

@inject IJSRuntime JSRuntime
@code {
    // Get a reference to the rendered element using 
    // the @ref="" syntax on the HTML element
    private ElementReference? ModalElement { get; set; }

    private async Task OnButtonClick()
    {
        // call the function with the element reference 
        // as the first and only argument
        await JSRuntime.InvokeVoidAsync(
            "myNamespace.bootstrap.modals.show", 
            ModalElement);
    }
}

我在這里包含了一個按鈕,只是為了演示——您可以以一種對您有意義的方式連接到邏輯中。

Edit

事件處理程序在模態(tài)內(nèi)部工作的示例:

<div class="modal" tabindex="-1" @ref="@ModalElement">
    <!-- modal HTML omitted for brevity -->
    <button type="button" class="btn btn-primary" 
            @onclick="@OnActionButtonClick">
      Save changes
    </button>  
    <!-- modal HTML omitted for brevity -->         
</div>

@code {
    public async Task OnActionButtonClick()
    {
        // this is working after the modal is displayed
        await JSRuntime.InvokeVoidAsync("alert", "Hello, World!");
    }
}

值得一提的是,我使用的是Bootstrap v.3.2。

主站蜘蛛池模板: 亚洲AV综合色一区二区三区 | 亚洲日本一区二区三区| 日韩毛片一区视频免费| 日本不卡一区二区视频a| 国产精品视频无圣光一区| 中文字幕av无码一区二区三区电影| 无码精品黑人一区二区三区 | 一区二区三区四区精品视频| 国产Av一区二区精品久久| 国产高清在线精品一区小说| 亚洲欧美日韩一区二区三区在线| 麻豆精品一区二区综合av| 亚洲色一区二区三区四区 | 国产在线精品一区二区在线观看| 国产精品亚洲一区二区三区久久| 亚洲视频一区在线| 日韩免费无码视频一区二区三区| 果冻传媒一区二区天美传媒| 高清一区二区在线观看| 北岛玲在线一区二区| 精品视频午夜一区二区| 日韩免费视频一区| 国产一区二区三区美女| 色综合一区二区三区| 国产高清在线精品一区小说 | 久久久国产精品一区二区18禁| 日本大香伊一区二区三区| 国产美女av在线一区| 国产成人精品一区二区三区免费| 精品免费久久久久国产一区| 岛国精品一区免费视频在线观看 | 亚洲一区二区三区偷拍女厕| 91无码人妻精品一区二区三区L| 国产精品制服丝袜一区| 亚洲AV无码一区二三区| 精品深夜AV无码一区二区老年| 在线精品日韩一区二区三区| 国产一区三区三区| 日韩精品一区二区三区中文字幕 | 中文字幕一区二区三区乱码| 国精产品一区一区三区|