store&# 39;s的听众多次开火

Store's listeners fired many times

本文关键字:开火 store      更新时间:2023-09-26

在我的MVC 3应用程序中,我想在每次有新的可用数据时刷新部分视图。因此,为了从服务器端获取这些数据,我使用如下所示的componentLoader:

Panel lowerPanel = new Panel
        {
            Region = Region.South,
            Layout = "fit",
            ID = "WarningsPanel",
            AutoScroll = true,
            Loader = Html.X().ComponentLoader()
                .Url(Url.Action("_warningsView"))
                .Mode(LoadMode.Script)
                .MessageBusDirectEvents(
                new MessageBusDirectEvent()
                {
                    Name = "Warnings.Update",
                    Action = "_warningsView",
                    Buffer = 1000,
                    ExtraParams = { new { containerId = "WarningsPanel" } }
                }
               )
                .Params(new { containerId = "WarningsPanel" })
                .LoadMask(l => l.ShowMask = true)
        };

从服务器获得新数据后,我想调用一些javascript函数。所以我像这样设置我的局部视图:

    @(Html.X().GridPanel()
                           .ID("WarningsGridPanel")
                            .EnableColumnResize(true)
                            .Store(Html.X().Store()
                                 .DataSource(Model)
                                            .Model(Html.X().Model()
                                                            .Fields(
                                                               Html.X().ModelField().Name("id"),
 ...
                                            )
                                           .Listeners(l =>
                                           {
                                                                       l.DataChanged.BroadcastOnBus = "Warnings.Register";
                                                l.DataChanged.Buffer = 5000;
                                           })
                                           .MessageBusListeners(mbl => mbl.Add(new MessageBusListener { Name = "Warnings.Register", Fn = "WarningsStore.Register"}))
                            )
                            .ColumnModel(//Html.X().RowNumbererColumn().Align(Alignment.Center).Width(Unit.Pixel(30)),
                                        Html.X().Column().Text("ID").DataIndex("id").Flex(1).Hideable(false),
...
                            )))

当第一次刷新部分视图时,我可以在控制台上看到WarningsStore.Register JS函数被调用一次,但在第二次被调用两次第三次被称为3次……这就是我如何定义WarningsStore.Register JS函数:

WarningsStore = WarningsStore || {};
WarningsStore.Register = function (message, id, eOpts) {...}

有什么问题吗?有很多商店吗?我定义JS函数在错误的方式?

每次你调用你的函数,你添加一个新的MessageBusListener。你应该只添加一次。

可能会有帮助我刚刚将MessageBusListeners属性Single设置为true

MessageBusListeners(mbl => mbl.Add(new MessageBusListener { Name = "Warnings.Register", Fn = "WarningsStore.Register", Single=true}))