2011-10-25 33 views
16

Vì vậy, xây dựng một ứng dụng sử dụng nhiều (2 cho bây giờ) bộ sưu tập toàn cầu, nó là một danh mục của cả hai tài liệu và bệnh nhân, họ có quan hệ, nhưng không như trong, 1 tài liệu hoặc danh sách tài liệu thuộc về 1 bệnh nhân, do đó, họ thực tế là 2 bộ sưu tập riêng biệt,BackboneJs: làm thế nào để tôi bootstrap dữ liệu của tôi trong đánh dấu trang, và khi nào tôi gán chúng vào bộ sưu tập của tôi

ứng dụng của tôi được cấu trúc trong hệ thống mô-đun rất giống với cách thức được mô tả ở đây: http://weblog.bocoup.com/organizing-your-backbone-js-application-with-modules

tài liệu backbone.js nói về việc khởi động, để làm điều gì đó như thế này,

<script> 
    Accounts.reset(<%= @accounts.to_json %>); 
</script> 

đó là trong một ứng dụng Rails, tôi sẽ tuy nhiên cần phải làm điều đó khác nhau trong asp.net MVC3, nhiều khả năng tôi sẽ chỉ in ra chuỗi json của tôi mà không có sự <% =%> đó không phải là dao cạo view engine phong cách)

nhưng câu hỏi của tôi ở đây là,

Accounts.reset(...data...); này chỉ là nổi ở đâu đó trong đánh dấu của tôi, nó không có trong bất kỳ cách nào độc đáo có cấu trúc trong hệ thống mô-đun của tôi, không phải là có một cách để làm độc đáo điều này? nơi tôi có thể lấy dữ liệu, từ bên trong mô-đun của tôi?

và một câu hỏi phụ, giả sử tôi có một lộ trình trong ứng dụng của xương sống của tôi http://example.com/#documents

và ai đó gọi liên kết này trực tiếp, ứng dụng của tôi sẽ có dữ liệu sẵn sàng (từ bootstrap) đúng thời hạn, trước khi con đường riêng của mình là Thực thi?

+2

Tôi không có chuyên gia backbone.js nhưng tôi đã viết một JsFiddle đơn giản thực hiện kiểu khởi động này, mặc dù hơi khác một chút. Về cơ bản, tôi khi tôi khởi tạo View của mình, nó tạo ra Collection và gọi Collection.refresh(). Vì vậy, bất cứ nơi nào tôi tạo View của tôi, nó tự động khởi tạo dữ liệu của nó ... hoặc bootstraps dựa trên verbiage của bạn. Đây là liên kết đến JsFiddle: http: // jsfiddle.net/jcscoobyrs/WVX66/ –

+0

ý tưởng hay, nhưng khi tôi đọc tài liệu về xương sống, sử dụng tìm nạp (hoặc giống như bạn làm mới bộ sưu tập của bạn) là không cần thiết khi tải trang. lý do tại sao có kết nối thứ hai để tìm nạp tất cả dữ liệu, trong khi bạn có thể gửi nó ngay lập tức với trang. tất cả tôi tự hỏi là nếu cách tôi làm nó bây giờ là cách tốt nhất để cung cấp cho nó với html ... như bây giờ nó chỉ chèn một thẻ script, thêm một đống toàn bộ dữ liệu json, mà tôi tất nhiên loại bỏ sau khi khởi tạo bộ sưu tập của tôi. tuy nhiên vì json của bạn xuất phát từ một nguồn bên ngoài, bạn không thể sử dụng kỹ thuật của mình cho ví dụ của bạn nên sử dụng collection.refresh() sẽ là tốt nhất – Sander

+0

Backbone.js được ghi vào giao diện với các thiết bị đầu cuối RESTful và thực hiện điều này bằng cách liên kết Bộ sưu tập của bạn với REST endpoint được sử dụng để lấy/làm tươi bộ sưu tập của bạn. Trong khi bạn có thể khởi động mọi thứ theo cách bạn muốn, như bạn thấy bằng câu trả lời bạn nhận được, nó không phổ biến như bạn nghĩ. Mục đích của backbone.js và tương tự là tách giao diện người dùng/Chế độ xem khỏi chính dữ liệu như vậy trong trải nghiệm của tôi, tôi không bao giờ chuyển bất kỳ thứ gì nhiều hơn HTML bản mẫu để tải backbone.js của mình, sau đó sẽ thực hiện công việc truy xuất/làm mới/quản lý các đối tượng dựa trên REST của tôi. "Đối với mỗi của riêng mình." :) –

Trả lời

10

Tôi có xu hướng thiết lập các đối tượng application - một đối tượng bao gồm tất cả mã cần thiết để khởi động ứng dụng của tôi. Sau đó tôi lấy các tham số vào hàm tạo của đối tượng đó, để chúng có thể được sử dụng bởi đối tượng ứng dụng. Việc chuyển dữ liệu JSON được nạp sẵn vào đối tượng ứng dụng là một trong những điều tôi làm, để giữ cho mã được sane và đóng gói.

Nó đi một cái gì đó như thế này, thường là:

MyApp = (function(Backbone, _){ 
    var MyModel = Backbone.Model.extend({}); 

    var MyCollection = Backbone.Collection.extend({ 
    model: MyModel 
    }); 

    var MyView = Backbone.View.extend({ 
    initialize: function(){ 
     this.collection.bind("reset", this.render, this); 
    }, 

    render: function(){ 
     // do stuff with the collection here 
    } 
    }); 

    var myApp = function(initialModels){ 
    this.start = function(){ 
     this.models = new MyCollection(); 
     this.myView = new MyView({collection: this.models}); 
     this.models.reset(initialModels); 
    }; 
    }; 

    return myApp; 
})(Backbone, _); 

Và sau đó trong trang của tôi mà cần phải khởi động ứng dụng, tôi làm điều này:

<script language="javascript"> 
    var myApp = new MyApp(<%= mymodels.to_json %>); 
    myApp.start(); 
</script> 

Đó là phiên bản đường ray của khóa học. Chỉ cần thay thế <%= ... %> bằng phiên bản của bạn cho cú pháp Dao cạo trong ASP.NET MVC.

+1

Ok, cảm ơn bạn đã cập nhật, có vẻ như rất giống với những gì tôi làm, chỉ có tôi để lại tất cả các mã trong các tệp javascript, điều duy nhất tôi không cảm thấy thoải mái là thẻ script nhỏ mà tôi để lại trong khung nhìn, với cửa sổ chỉ để sau này sử dụng nó trong tuyên bố sẵn sàng tài liệu của tôi giống như bạn đưa nó trực tiếp. nhưng tôi thấy đó là nỗi đau tôi sẽ phải chịu do nhận được kịch bản của tôi ra khỏi các tập tin xem tôi đoán. – Sander

0

nếu trên Rails: ngoài Dericks câu trả lời bạn có thể muốn sử dụng Gon để "có được biến Rails của bạn trong js của bạn".

sau đó bạn sẽ khởi tạo ứng dụng của bạn như thế:

<script language="javascript"> 
    var myApp = new MyApp(gon.mymodels); 
    myApp.start(); 
</script> 
0

Các ví dụ tuyệt vời từ Derick! Đối với MVC 3+, hãy sử dụng cú pháp này:

<script language="javascript"> 
    var myApp = new MyApp(@Html.Raw(Json.Encode(Model))); 
    myApp.start(); 
</script> 
Các vấn đề liên quan