【问题标题】:Blazor, run non static function when static string changeBlazor,静态字符串更改时运行非静态函数
【发布时间】:2021-11-12 09:57:46
【问题描述】:

我有一个带有静态字符串的静态类,该字符串由 Javascript 更改。在(非静态)blazor 组件中检查此字符串更改的最佳方法是什么?

我可以在计时器上运行一个函数,并让它在发生更改时通知我,我还有哪些其他选项?

需要知道静态字符串是否已更改的函数存在于从 ComponentBase 继承的组件中,如果有帮助的话。

【问题讨论】:

  • 观察者模式?
  • 如何“更改”字符串?你打电话给属性设置器吗?然后在那个 setter 中包含代码,或者引发一个事件?
  • 我们能看一些代码吗?你的组件和静态字符串类
  • @RobertHarvey 是的,这可能是 2 的方式,正如 Amir 在下面提到的那样存在内存泄漏的潜在问题,我猜我只有 2 小心
  • @KrisVandermotten 该值是由我无法控制的 js 设置的

标签: c# blazor .net-5 blazor-jsinterop


【解决方案1】:

仅提及您可以通过利用 Blazor JavaScript 互操作调用实例 .Net 方法,请查看 following MS documentation

但要回答您的问题,正如 Robert 在评论中指出的那样,使用观察者模式或简单的 Event 可以满足您的需求:

static class MyStaticClass
{
    public static EventHandler<string> MyPropertyChanged;

    private static string _myProperty;
    public static string MyProperty
    {
        get => _myProperty;
        set
        {
            if (_myProperty != value)
            {
                _myProperty = value;
                MyPropertyChanged?.Invoke(typeof(MyStaticClass), _myProperty);
            }
        }
    }
}

然后你可以在你的非静态类中订阅这个事件:

public class MyClass
{
    public MyClass()
    {
        MyStaticClass.MyPropertyChanged += MyPropertyChanged;
    }

    private void MyPropertyChanged(object sender, string e)
    {
        Console.WriteLine($"Changed value is {e}");
    }
}

但是,如果您的 MyClass 实例不在应用程序的整个生命周期中存在,而静态事件却存在,订阅静态类事件的问题将是潜在的内存泄漏。看看Jon Skeet's 对此的解释。完成MyClass 实例后,您可以尝试取消订阅该事件。此外,对于 Blazor 组件,请查看Component disposal with IDisposable and IAsyncDisposable,您可以在其中取消订阅组件处理。您也可以尝试实现Weak Event Pattern 来解决这个问题。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-01-16
    • 1970-01-01
    • 2015-03-30
    • 2021-10-20
    • 1970-01-01
    • 2015-06-28
    相关资源
    最近更新 更多