![](/img/trans.png)
[英]Uncaught TypeError: Cannot read property 'removeChild' of null without using removeChild
[英]Blazor TypeError: Cannot read property 'removeChild' of null at Object.e [as removeLogicalChild]
我為雙列表框創建了一個組件。 一切都很好,但是當我提交時出現錯誤。
<EditForm Model="Model.Report" class="kt-form" OnValidSubmit="Model.OnSearch">
<div class="modal-header">
<h5 class="modal-title" id="exampleModalLabel">Edit Columns</h5>
<button type="button" class="close" data-dismiss="modal" aria-label="Close">
</button>
</div>
<div class="modal-body">
<div class="row">
<div class="col-md-12">
<Project.Components.DualListbox ReportColumns="Model.Report.ReportColumns" Id="ReportColumns" @bind-Value="@Model.Report.ReportColumns"></Project.Components.DualListbox>
</div>
</div>
</div>
<div class="modal-footer">
<button type="button" class="btn btn-secondary btn-sm" @onclick="Model.OnCloseModal"><i class="la la-close"></i> Close</button>
<button type="submit" class="btn btn-primary btn-sm"><i class="la la-exchange"></i> Change</button>
</div>
</EditForm>
DualListbox
Razor 代碼:
@typeparam TValue
@inherits InputBase<TValue>
@if (ReportColumns != null)
{
<select id="@Id" class="kt-dual-listbox" multiple>
@foreach (var column in ReportColumns.OrderBy(c => c.Sort))
{
if (column.IsChecked == 1)
{
<option value="@column.Id" selected>@column.Title</option>
}
else
{
<option value="@column.Id">@column.Title</option>
}
}
</select>
}
* DualListbox
代碼隱藏 *:
using Project.Models;
using Microsoft.AspNetCore.Components;
using Microsoft.AspNetCore.Components.Forms;
using Microsoft.JSInterop;
using System;
using System.Collections.Generic;
using System.Globalization;
using System.Linq;
using System.Threading.Tasks;
namespace Project.Components
{
public partial class DualListbox<TValue> : InputBase<TValue>
{
[Parameter] public string Id { get; set; }
[Inject] IJSRuntime JSRuntime { get; set; }
[Parameter] public ICollection<ReportColumn> ReportColumns { get; set; }
public DotNetObjectReference<DualListbox<TValue>> DotNetRef;
[Parameter] public EventCallback<object> OnChanged { get; set; }
protected override bool TryParseValueFromString(string value, out TValue result, out string validationErrorMessage)
{
try
{
if (value == "null")
{
value = null;
}
if (typeof(TValue) == typeof(string))
{
result = (TValue)(object)value;
validationErrorMessage = null;
return true;
}
else if (typeof(TValue) == typeof(int) || typeof(TValue) == typeof(int?))
{
int.TryParse(value, NumberStyles.Integer, CultureInfo.InvariantCulture, out var parsedValue);
result = (TValue)(object)parsedValue;
validationErrorMessage = null;
return true;
}
throw new InvalidOperationException($"{GetType()} does not support the type '{typeof(TValue)}'.");
}
catch (Exception ex)
{
throw ex;
}
}
protected override void OnInitialized()
{
base.OnInitialized();
DotNetRef = DotNetObjectReference.Create(this);
}
protected override async Task OnAfterRenderAsync(bool firstRender)
{
await base.OnAfterRenderAsync(firstRender);
if (firstRender)
{
await JSRuntime.InvokeVoidAsync("dualListboxComponent.init", Id, DotNetRef, "Change_SelectWithFilterBase");
}
}
[JSInvokable("Change_SelectWithFilterBase")]
public void Change(string value)
{
try
{
if (value == "null")
{
value = null;
}
var array = value.Split("#");
if (array[0] == "add")
{
int _value = int.Parse(array[1]);
var report = ReportColumns.Where(c => c.Id == _value).FirstOrDefault();
report.IsChecked = 1;
}
else
{
int _value = int.Parse(array[1]);
var report = ReportColumns.Where(c => c.Id == _value).FirstOrDefault();
report.IsChecked = 0;
}
}
catch (Exception ex)
{
throw ex;
}
if (OnChanged.HasDelegate)
OnChanged.InvokeAsync(value);
}
}
}
[2020-02-12T07:42:28.867Z] 錯誤:應用批處理 7 時出錯。e.log @ blazor.server.js:15 blazor.server.js:8 Uncaught (in promise)
類型錯誤:無法在 Object.s [as insertLogicalChild] (blazor.server.js:8) at e.insertText (blazor.server.js:8) at e.insertFrame (blazor.server.js) 中讀取 null 的屬性“insertBefore” :8) 在 e.applyEdits (blazor.server.js:8) 在 e.updateComponent (blazor.server.js:8) 在 Object.t.renderBatch (blazor.server.js:1) 在 e. (blazor.server.js:15) 在 blazor.server.js:15 在 Object.next (blazor.server.js:15) 在 blazor.server.js:15 blazor.server.js:15 [2020-02- 12T07:42:28.926Z] 錯誤:System.AggregateException:發生一個或多個錯誤。 (TypeError: 無法讀取 null 的屬性“insertBefore”) ---> System.InvalidOperationException: TypeError: 無法讀取 Microsoft.AspNetCore.Components.RenderTree.Renderer.InvokeRenderCompletedCallsAfterUpdateDisplayTask(Task updateDisplayTask, Int32[] updatedComponents 處的 null 屬性“insertBefore” ) --- 內部異常堆棧跟蹤結束---
因此,這可能不是您的確切答案,但它可能會為偶然發現此 SO 問題的人提供線索。 就我而言,這是在按鈕文本中換出一個 Font Awesome 圖標而不是使用兩個單獨的按鈕的結果。
這可能是相關的,因為您將 JSRuntime 與“report.IsChecked = 1;”結合使用語法,我假設它正在更改 Blazor 服務器試圖(但無法)跟蹤的 UI 元素狀態客戶端。
當我在單個按鈕中使用條件邏輯來換出圖標時,我收到一個錯誤,“blazor TypeError:無法讀取 null 的屬性‘removeChild’”。 但是,這種使用兩個單獨按鈕的語法效果很好:
@if (AllowAllPartners)
{
<button @onclick="(() => AllowAllPartnersToggle())">
<i class="far fa-check-square"></i>
</button>
}
else
{
<button @onclick="(() => AllowAllPartnersToggle())">
<i class="far fa-square"></i>
</button>
}
我的問題也出在 FontAwesome 中。 就我而言,將圖標放在<span></span>
解決了問題。
@if (conditional)
{
<span>
<i class="fas fa-check"></i>
</span>
}
else
{
<span>
<i class="fas fa-times"></i>
</span>
}
在我的情況下,同樣的錯誤是由我使用 Bootstrap Dismissible Alerts 引起的,其中包含一個 MatBlazor 組件和/或 FontAwesome 圖標。
將警報放在另一個<div></div>
解決了這個問題。 將圖標/組件放在<span></span>
內的警報內不起作用,但由於 Diego 的建議,我找到了這個解決方案 :-)
<div>
<div class="alert alert-warning alert-dismissible fade show" role="alert">
Warning Text <MatTooltip Tooltip="Tooltip text" Context="_context1" Wrap="true" Position="@MatTooltipPosition.Top"><i class="far fa-question-circle"></i></MatTooltip>
<button type="button" class="close" data-dismiss="alert" aria-label="Close">
<span aria-hidden="true">×</span>
</button>
</div>
</div>
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.