2012-06-26 64 views
20

Tôi thừa nhận điều đó, tôi không biết mình đang làm gì.

Tôi đang cố gắng tìm hiểu cách sử dụng SignalR và tôi đang theo dõi các mẫu khác nhau trực tuyến gần như nguyên văn và tôi không thể được dán $ .kết nối không xác định. Tôi đang làm việc trong MVC 4.0 và cố gắng sử dụng một trong hai tệp tin signalR js hoặc tải xuống từ các dự án mẫu. Đây là tài liệu tham khảo kịch bản của tôi.

@Scripts.Render("~/Scripts/jquery-1.7.2.min.js") 
@Scripts.Render("~/Scripts/knockout-2.0.0.js") 
@Scripts.Render("~/Scripts/jquery.signalR.js") 
@Scripts.Render("~/signalr/hubs") 

Các tập lệnh dường như tải - Tôi thậm chí còn đặt cảnh báo khi bắt đầu chúng, nhưng $ .connection luôn không xác định.

Trong một biến kỳ lạ của sự kiện, tôi có một dự án khác mà tôi đang cố gắng sử dụng một thư viện jQuery khác và nó sử dụng $. và đối tượng đó là C alwaysNG luôn không xác định.

Tôi chỉ đang tìm kiếm bất kỳ giải thích nào có thể về những gì tôi có thể đang làm sai. Cảm ơn rất nhiều trước.

+0

Làm sao chúng ta phải giúp đỡ mà không có dấu vết nhỏ của mã? – Cranio

+3

Bạn có jQuery bao gồm hai lần trên trang không? – davidfowl

Trả lời

8

Tôi đã giải quyết được sự cố. Tôi biết những gì tôi đã làm nhưng tôi không biết tại sao nó làm việc cho chắc chắn.

Tôi đã tham khảo thư viện jquery chính (phiên bản 1.7.2) ở đầu chế độ xem _Layout.cshtml, nhưng không tham chiếu bất kỳ tập lệnh jquery nào khác. Tôi nhận thấy rằng theo mặc định ở chế độ xem bố cục, nó đang tải

@Scripts.Render("~/bundles/jquery") 

ở cuối chế độ xem và phần tập lệnh được đặt bên dưới phần đó.

@RenderSection("scripts", required:false) 

Tôi cũng thay đổi tài liệu tham khảo kịch bản của tôi như thể hiện và đưa tài liệu tham khảo kịch bản của tôi thể hiện trong câu hỏi ở trên bên trong một wrapper

@section scripts 
{  
    @Scripts.Render("~/Scripts/jquery.signalR-0.5.1.js") 
    @Scripts.Render("~/Scripts/jquery.color.js") 
    @Scripts.Render("~/signalr/hubs") 
    @Scripts.Render("~/Scripts/blasht.signalr.js") 
} 

trên quan điểm của tôi để họ sẽ được đưa sau khi các bó được nạp. Tôi cho rằng tôi đã không tải tất cả các jquery cần thiết bởi vì bây giờ nó hoạt động.

Bây giờ, nếu tôi có thể tìm hiểu cách áp dụng điều này cho các dự án khác của tôi.

3

Lý do hoạt động này là do thứ tự các tệp javascript được tải. Nếu bạn thử tải jquery.signalR-0.5.1.js trước khi tải jquery, thì bạn sẽ phải đối mặt với $ .connection không xác định vì vì điều này để đăng ký jquery nên được nạp trước. Trong mẫu _Layout.cshtml các tập lệnh tải theo thứ tự

@Scripts.Render("~/bundles/jquery") 

@RenderSection("scripts", required: false) 

Vì vậy, bên trong bất kỳ quan điểm nào bạn có thể tải tín hiệu trong phần tập lệnh và điều này sẽ hoạt động tốt.

44

Tôi gặp vấn đề tương tự ngay hôm nay.

Câu trả lời của bạn đã chỉ cho tôi đúng hướng, bởi vì tôi đã có cùng một cài đặt CHÍNH XÁC để tải tập lệnh.

Tôi có tất cả các thẻ tập lệnh của tôi ở đầu trang (đầu) theo thứ tự sau.

  • JQuery
  • SignalR
  • /signalr/hub
  • my-script.js

Và tất nhiên, Layout.cshtml @ quá chu đáo để thêm @Scripts.Render("~/bundles/jquery") ở cuối thẻ <body>.

Đây là những gì đang diễn ra.

Trong cấu hình này, khi tải trang, nó tải lên tất cả các tập lệnh trong thẻ đầu, theo thứ tự chúng được chỉ định.

để tải JQuery, rồi SignalR, thiết lập $.connection sau đó tập lệnh trung tâm được tạo tự động thiết lập $.connection.hubName, sau đó là tập lệnh tùy chỉnh của trang web.

Tại thời điểm này, mã tùy chỉnh của bạn chạy. NHƯNG mã của bạn tại một số điểm, đợi body.onload hoặc document.onReady trước khi truy cập vào $.connection

Khi sự kiện này kích hoạt, gói kịch bản mà mẫu Bố cục được thêm cho bạn ở cuối thẻ nội dung cũng sẽ tải xuống và thực thi. Gói này có thư viện jquery một lần nữa .... đặt lại mọi thiết lập SignalR trên $ và bây giờ, $.connection của bạn không được xác định nữa.

Làm thế nào để giải quyết nó

Dễ dàng sửa chữa, chắc chắn bạn không tải JQuery hai lần, một lần trước khi SignalR và một lần sau khi SignalR. Tôi đã di chuyển tất cả các tập lệnh của mình để tải sau khi gói và nó đã khắc phục sự cố. Thực hành tốt nhất ở đây là sử dụng phần 'tập lệnh' do mẫu cung cấp.

@section scripts{ 
    @*/* load your scripts here. You can exclude jQuery, 
     coz it's already in the template */ *@ 
} 

Vì vậy, đây không phải là một lỗi SignalR ở tất cả ...

Đó là 2 giờ cuộc sống của tôi ... Tôi sẽ không bao giờ trở lại ...

Hope this helps.

+1

Tuyệt vời, cảm ơn. Vẫn không hoạt động nhưng nó khiến tôi gần gũi hơn (không còn lỗi trong bảng điều khiển) nữa! – user1477388

+1

Ôi Chúa ơi ..... cảm ơn câu trả lời :) – Dzhambazov

+0

u rock man ... !! nó đã làm việc và lưu những "nhà phát triển khác với cùng một vấn đề" quý giá:) – Kings

2

Tôi đã gặp vấn đề tương tự. cho tôi Tôi đã bao gồm jquery 2 lần trong trang và sau đó trong bố trí. Đã xóa một trong số họ đã khắc phục sự cố.

Hy vọng nó giúp

0

này xảy ra với tôi vì tôi tự động nạp các tập lệnh ~/signalr/hubs trước khi tải các tập lệnh jquery.signalR-1.1.4.js.

Khi nạp tự động, không có lỗi đã có mặt, tuy nhiên nếu tôi lấy đầu ra của ~/signalr/hubs và dán nó vào công cụ chrome dev của tôi, tôi nhận được một thông báo lỗi VM1047:18 Uncaught Error: SignalR: SignalR is not loaded. Please ensure jquery.signalR-x.js is referenced before ~/signalr/hubs. at <anonymous>:18:15 at <anonymous>:300:2