0

ボタンが押されたときにデータベース情報をリストに表示するSignalRデモを実行しています。

My Hubには2つの機能があります。1つはリストからDBオブジェクトを削除する機能で、もう1つはそのリストにDBオブジェクトを再追加する機能です。

これらの機能はビューで実行され、ページを1回だけ開いたときに優れたパフォーマンスを発揮します。しかし、別のタブ(同じブラウザでも別のブラウザでもかまいません)でページを開くと、ページの同期が維持されません。つまり、一方のページのボタンを押すと、もう一方のページにデータが正しく表示されません。

多くの場合、一方のページは正常に機能し、もう一方のページは削除を実行しますが、追加は実行しません。それは気が遠くなるようなものです。それらは私の理解からの相互の反映であるべきです。

他の誰かが似たようなものに遭遇しましたか?助けてくれてありがとう!

これが私のハブです:

[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

代わりにこれを試してください:

<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 に答える
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は、そのFAQの質問をリストに追加しています。

$(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();
});

個別に印刷するデータの単純な文字列を送信するだけで、ページの同期を維持できるようです。私が送信するデータの前はDBオブジェクトのリストであり、Javascriptはそれぞれをループして、そのオブジェクトの質問列をリストに追加していました。これがなぜこのような問題であったのかはわかりませんが、特に1つの開いているタブでは機能するが、すべての開いているタブでは機能しないためですが、その単純な変更でサイトの同期の問題が修正されました。
再度、感謝します!

于 2012-07-19T16:32:43.400 に答える