0

我正在完成一个 SignalR 演示,该演示在按下按钮时在列表中显示数据库信息。

My Hub 有两个功能:一个是从列表中删除数据库对象,另一个是重新添加数据库对象到该列表。

这些功能在我的视图中执行,并且在我只打开一次页面时执行得很好。但是如果我在另一个选项卡中打开页面(可以是相同的浏览器或不同的浏览器),页面不会保持同步。意思是,当一个页面的按钮被点击时,另一个页面没有正确显示数据。

通常一个页面会很好,而另一个页面会执行删除而不是添加!这令人难以置信。根据我的理解,它们应该只是彼此的反映。

有没有其他人遇到过类似的事情?提前感谢您的帮助!

这是我的集线器:

[HubName("hubtest")]
public class HubTest : Hub
{
    CmsContext db = new CmsContext();

    public void showdata()
    {
        var f = from x in db.Data
                select x;
        Clients.remove();

        Clients.add(f);
    }
}

这是我的功能视图中的javascript:

<script src="Scripts/jquery-1.6.4.min.js" type="text/javascript"></script>
<script src="Scripts/jquery.signalR-0.5.2.min.js" type="text/javascript"></script>
<script src="/signalr/hubs" type="text/javascript"></script>
<script type="text/javascript">

$(function () {
    var hubtest = $.connection.hubtest;

    hubtest.remove = function () {
        //clear list of any prior values
        var list = document.getElementById('dataList');
        while (list.hasChildNodes()) {
            list.removeChild(list.childNodes[0])
        }
    };

    hubtest.add = function (data) {
        //populate with updated values
        for (var i = 0; i < data.length; i++) {
            var element = data[i];
            $('#dataList').append('<li>' + element.Question + '</li>');
        }

    };

    $("#broadcast").click(function () {
        hubtest.showdata();

    });

    // Start the connection
    $.connection.hub.start();
});
</script> 


<input type="button" id="broadcast" value="broadcast" />
<ul id="dataList">
</ul>
4

2 回答 2

0

首先感谢您的回复。我非常感谢您的反馈!
通过改变我的数据发送到视图的方式,我最终得到了在多个选项卡中打开时我的页面保持同步的位置。我在我的 Javascript 中执行 for 循环以显示每条数据,现在我在我的集​​线器中这样做:

[HubName("hubtest")]
public class HubTest : Hub
{
    CmsContext db = new CmsContext();

    public void showdata()
    {
        Clients.clearlist();
        var faqs = from x in db.Faqs
                select x;
        foreach (Faq faq in faqs)
        {
            Clients.add(faq.Question.ToString());
        }
    }
}

然后我的 Javascript 只是将该常见问题解答问题附加到列表中:

$(function () {
    var hubtest = $.connection.hubtest;

    hubtest.clearlist = function () {
        var list = $('#datalist');
        list.empty();
    };

    hubtest.add = function (data) {            
        $('#datalist').append('<li>' + data + '</li>');
    };

    $("#broadcast").click(function () {
        hubtest.showdata();
    });

    // Start the connection
    $.connection.hub.start();
});

仅发送要单独打印的简单数据字符串似乎可以使我的页面保持同步。在我发送的数据之前是一个数据库对象列表,我的 Javascript 循环遍历每个对象并将该对象的问题列添加到列表中。不知道为什么会出现这样的问题 - 特别是因为它可以在一个打开的选项卡上工作,但不能在所有打开的选项卡上工作 - 但这个简单的更改解决了我的站点同步问题。
再次感谢!

于 2012-07-19T16:32:43.400 回答
0

试试这个:

<script type="text/javascript">
    $(function () {
        var hubtest = $.connection.hubtest;

        hubtest.add = function (data) {
            //clear the values first.
            var list = $('#dataList');
            list.empty();

            //populate with new values
            for (var i = 0; i < data.length; i++) {
                var element = data[i];
                list.append('<li>' + element.Question + '</li>');
            }

        };

        $("#broadcast").click(function () {
            hubtest.showdata();

        });

        // Start the connection
        $.connection.hub.start();
    });
</script>

和这个:

[HubName("hubtest")]
public class HubTest : Hub
{
    TestDatabaseEntities db = new TestDatabaseEntities();

    public void showdata()
    {
        var f = from x in db.FAQs
                select x;

        Clients.add(f);
    }
}
于 2012-07-19T00:19:46.780 回答