2013-06-09 29 views
7

Vì vậy, tôi đang tích hợp SignalR và HotTowel, mặc dù thực sự tôi nghĩ rằng đây là một vấn đề làm thế nào để tích hợp với Durandal chính nó.HotTowel (Durandal thực sự) và initialRation SignalR

Vấn đề là tôi có nhiều lượt xem rõ ràng. Một số trong những quan điểm này tôi muốn trả lời tin nhắn SignalR. Câu hỏi đặt ra là làm thế nào để thực hiện việc tích hợp này khi xem xét các sự kiện SignalR phải được bắt đầu trước khi tôi gọi phương thức start hub của SignalR.

Vì vậy, lấy ví dụ tôi có dạng xem1 và view2. Tôi muốn mỗi người làm điều gì đó khi nhận được một tin nhắn SignalR và trong bối cảnh của khung nhìn đó (vì vậy hãy nói cập nhật DOM bằng cách nào đó). Đó là một SPA rõ ràng để gọi phương thức khởi động SignalR cho mỗi lượt xem có vẻ như là một ý tưởng tồi, vì vậy hãy bắt đầu SignalR một lần khi khởi động giống như kế hoạch đúng, nhưng tại thời điểm đó quan điểm của tôi có thể chưa được tải, và tôi sẽ đảm bảo như thế nào sự kiện của tôi có ngữ cảnh phù hợp cho trang.

Điều này dựa trên sự hiểu biết của tôi rằng tất cả các sự kiện cho SignalR phải được đăng ký trước khi tôi bắt đầu gọi. Bất kỳ suy nghĩ người thông minh của StackOverflow?

Edit để mở rộng vấn đề

Một phần của trang web liên quan đến các file tải lên để phân tích và xử lý để nhập khẩu vào một cơ sở dữ liệu. Tôi đã tạo chế độ xem nơi tệp được chọn và tải lên (sử dụng FineUploader) cho một WebApiController. Bộ điều khiển thực hiện các bước cơ bản để kiểm tra tệp đã tải lên và sau đó bắt đầu một tác vụ không đồng bộ để thực sự phân tích cú pháp và xử lý, trong khi ngay lập tức trả về thông báo "Yep đã tải lên tốt" cơ bản.

Điều này khiến danh sách các tệp 'đang xử lý' cần làm mới và tệp xuất hiện với trạng thái 'Đã tải lên'. Khi tác vụ không đồng bộ xảy ra, tệp được phân tích cú pháp, sau đó được xử lý dựa trên hệ thống quy tắc và sau đó được nhập vào một cửa hàng dữ liệu cuối khác. Khi mỗi thay đổi trạng thái này xảy ra, SignalR gửi tin nhắn tới máy khách để thông báo cho họ về những thay đổi này, và do đó cập nhật trạng thái với tên tệp. Để điều này xảy ra, tôi phải đính kèm một chức năng cho sự kiện khi nó nhận được trong SignalR. Điều đó thậm chí cần một số loại tham chiếu đến chế độ xem của tôi (thực sự là viewmodel) để nó có thể cập nhật giá trị chính xác.

Vì SignalR nên được bắt đầu một lần bằng một cuộc gọi đến hub.Start(), tôi đang cố gắng thực hiện trong giai đoạn 'khởi động'. Tuy nhiên khi SPA của tôi bắt đầu, khung nhìn đó chưa được nạp, và do đó không có viewmodel đó, và do đó chức năng của tôi chịu trách nhiệm khởi tạo SignalR có thể không có sự hiểu biết về view/viewmodel mà nó phải cập nhật.

Ví dụ tôi đã thấy khi sử dụng SignalR cho thấy nó đang được sử dụng trong một chế độ xem, nhưng điều đó không thực sự hoạt động nếu bạn cần trong nhiều chế độ xem (bạn không thể chỉ gọi hub.start())?

Rất tiếc, nếu điều này vẫn không có ý nghĩa, tôi sẽ đăng một số mã hoặc một số thứ.

+1

bạn có thể mô tả sự cố mà bạn đang cố giải quyết thêm không? Và bạn đã thử cái gì? –

Trả lời

9

Nếu bạn sử dụng

$.connection.myHub.on("myMethod", function (/* ... */) { /* ... */ }); 

thay vì

$.connection.myHub.client.myMethod = function (/* ... */) { /* ... */ }; 

bạn có thể thêm các phương pháp trung tâm client-side sau khi gọi $.connection.hub.start();

+0

Tuyệt vời! chính xác kỹ thuật tôi đang tìm kiếm. Tôi google'd những thứ như 'sự kiện signalR sau khi bắt đầu trung tâm' và một số lý do chỉ không thể tìm thấy bất cứ điều gì mô tả thay thế này! Cảm ơn halter73! – Adam

+0

Không chỉ Durandal hoặc HotTowel, nhưng bất kỳ lợi ích ứng dụng SPA nào từ việc này. Tôi đang làm việc trên một ứng dụng Backbone, Underscore và điều này giải quyết vấn đề của tôi với SignalR không nhận được tin nhắn push. –

+1

Tôi sẽ thêm rằng bạn phải có ít nhất một cuộc gọi lại cho mỗi trung tâm có dây trước khi bạn bắt đầu kết nối. Nó không quan trọng nếu callback no-ops. Một khi bạn làm điều đó, bạn sẽ có thể thêm một loại bỏ callbacks như bạn vui lòng, ngay cả khi kết nối SignalR được mở. – halter73

Các vấn đề liên quan