【问题标题】:How can I tell if an element reference does exist in blazor如何判断 blazor 中是否存在元素引用
【发布时间】:2020-10-12 14:56:44
【问题描述】:

如果一个元素在第一次渲染中被隐藏(例如,该元素在一个 if 语句范围内,它被评估为 false,所以不会被渲染),并且某些事件使它出现(if 语句评估为 true)渲染后更新内部元素引用。这绝对没问题。

但是如果发生相反的事件流(首先是真的,然后被某些事件隐藏),元素引用在渲染后不会更新,仍然显示原始 id 而不是 null 或空字符串。在这种情况下,如果我使用该元素引用调用 JsInterop,则会给出元素不存在的错误(这显然是正确的)。问题是元素引用仍然有以前的id,渲染后没有改变。

问题是如何判断一个元素是否可见(渲染、存在)?

【问题讨论】:

    标签: c# blazor blazor-webassembly


    【解决方案1】:

    Blazor 不会破坏 ElementReference 对象。它被保留以供进一步使用。但它总是填充新数据;也就是叛乱的 ElementReference 对象获得了一个新的 id。因此,您始终可以比较 id 的两个连续值

    您可以将元素引用设置为其默认值:

    elementRef = default(ElementReference);
    

    这相当于将引用对象设置为null。

    你可以检查天气元素引用确实存在这样的;

    if (EqualityComparer<ElementReference>.Default.Equals(elementRef, 
                                                 default(ElementReference)))
     {
         // Does not exist...      
     }
     
    

    试试这段代码,看看你说的都是错的,除非我没听懂。

    @page "/"
    
    
    @if (display)
    {
        <div @ref="elementRef">Welcome to your new app.</div>
    }
    
    <button @onclick="@(() => display = !display )">Toggle</button>
    <button @onclick="ConsoleWrite">Console</button>
    @code{ 
        private bool display = true;
        ElementReference elementRef;
    
        private void ConsoleWrite()
        {
                   
            Console.WriteLine(elementRef.Id);
    
            if (!EqualityComparer<ElementReference>.Default.Equals(elementRef, default(ElementReference)))
            {
                Console.WriteLine("return false");
            }
    
            // Set the element reference to its default value
            elementRef = default(ElementReference);
    
            if (EqualityComparer<ElementReference>.Default.Equals(elementRef, default(ElementReference)))
            {
                Console.WriteLine("Return true after being set to its default value");
            }
    
            Console.WriteLine("elementRef.Id is null now" + elementRef.Id);
    
        }
    }
    

    【讨论】:

    • 我已经尝试过这个解决方案,但不幸的是它不起作用。比较器的结果为 false,并且在元素被隐藏并且组件被重新渲染后,elemenetRef id 保持不变。另外我不认为 ElementReference 可以被破坏,因为它是一个结构,所以它只是被它应该在调用 OnAfterRender() 之前获得的新值覆盖。
    • 启动后,我按下控制台按钮,这是输出:return false 设置为默认值后返回true elementRef.Id 现在为null,这是在按下切换按钮后再次控制台: blazor.webassembly.js:1 blazor.webassembly.js:1 设置为其默认值后返回 true blazor.webassembly.js:1 elementRef.Id 现在为 null
    • 您在 ConsoleWrite 方法中显式地将元素引用设置为其默认值。如果我重新启动,然后先按下切换按钮(隐藏文本)而不是按下 ConsoleWrite 按钮,这就是我得到的:return false blazor.webassembly.js:1 在设置为其默认值 blazor.webassembly.js 后返回 true: 1 elementRef.Id 现在为空如您所见,如果我不“手动”将元素引用设置回其默认值,则在调用 OnAfterRender 时它不会更新。
    • 虽然这看起来是一种解决方法,但我可以在隐藏元素时将其设置回默认值。我将您的答案标记为一个很好的答案,因为它对我有帮助,非常感谢,但我仍然很想知道如何让它开箱即用......再次感谢!
    • 我建议您在 github 上发布一个问题,要求 Blazor 团队考虑开箱即用的功能...
    猜你喜欢
    • 2011-11-02
    • 1970-01-01
    • 2013-04-01
    • 1970-01-01
    • 2023-03-19
    • 2010-09-25
    • 1970-01-01
    • 2015-02-11
    • 2013-05-12
    相关资源
    最近更新 更多