2011-11-17 39 views
15

Tôi đang cố triển khai thử nghiệm cơ bản EXTREMELY sử dụng jquery, underscore.js và backbone.js được tải qua require.js và vì một lý do nào đó tôi dường như không thể có được mọi thứ xếp hàng đúng cách. Nghiên cứu cho thấy những người khác đã không có những vấn đề tương tự vì vậy tôi biết nó phải là một cái gì đó đơn giản mà tôi chỉ không nhìn thấy.Backbone/Underscore rất cơ bản thông qua vấn đề Require.js lái xe cho tôi batty

Sự cố tôi gặp phải là khi backbone.js đang tải, nó không thể tìm thấy tham chiếu đến _. Tôi đã tìm thấy những người khác báo cáo cùng một vấn đề nhưng vấn đề thường đi qua tham chiếu phụ thuộc vào trình xử lý theo thứ tự sai hoặc các vấn đề rõ ràng khác. Điều này xảy ra khi xương sống đang tải.

Tôi cũng thấy một số giải pháp 'cơ khí' như 'đặt mọi thứ vào cùng một tệp' và chỉ tải chúng theo cách truyền thống bằng cách có một số tập lệnh bao gồm theo thứ tự đúng nhưng tôi thực sự muốn điều này làm việc vì nó có vẻ như một cách tiếp cận mạnh mẽ như vậy.

Ban đầu tôi bắt đầu với cấu trúc ở đây http://backbonetutorials.com/organizing-backbone-using-modules/ hoạt động trong bản trình diễn, nhưng cảm thấy một chút mong manh vì khi tôi cố gắng sửa đổi rất đơn giản hoặc xây dựng một mẫu đơn giản từ đầu, nó sẽ bị hỏng.

Sau khi đánh đầu với điều này quá lâu, tôi đã quay lại và tìm thấy trang này Loading Backbone and Underscore using RequireJS bằng một ví dụ đơn giản khác và tôi lấy lại hy vọng. Tuy nhiên, sau khi xây dựng một thử nghiệm mới dựa trên nó, tôi STILL nhận được cùng một vấn đề mặc dù chi nhánh 0.5.3-optamd của xương sống được cho là phải xử lý sự phụ thuộc của riêng nó trên dấu gạch dưới.

Nếu không có thêm quảng cáo, đây là mã siêu thẳng tiến sẽ hoạt động nhưng thay vào đó khiến tôi phát điên. Đây là hy vọng đó là một cái gì đó rõ ràng tôi chỉ bỏ lỡ bằng cách nào đó:

index.html

<!DOCTYPE html> 
<html> 
    <head> 
     <title>Backbone.js/Underscore.js via Require.js Learning Page</title> 
     <script src="js/libs/require/require.js"></script> 
     <script src="js/main.js"></script> 
    </head> 
    <body> 
     <div>Backbone.js/Underscore.js via Require.js Learning Page</div> 
     <div class="testhook"></div> 
    </body> 
</html> 

js/main.js

require.config({ 
    paths: { 
      'jquery': 'libs/jquery/1.7/jquery', 
      'underscore': 'libs/underscore/1.2.2/underscore', 
      'backbone': 'libs/backbone/0.5.3-optamd/backbone' 
    }, 
    baseUrl: '/js', 
    urlArgs: 'v=1.0' 
}); 

require([ 
     'domReady', 
     'app' 
     ], 
     function(domReady, App){ 
      domReady(function(){ 
       console.log('Dom is ready'); 
       App.init(); 
      }); 
     } 
); 

js/app.js

// Filename: app.js 
define([ 
     'jquery', 
     'underscore', 
     'backbone' 
     ], 
     function($, _, Backbone){ 

      var init = function(){ 

       console.log('app.js > init()'); 

       // jquery test (WORKS) 
       $('.testhook').append('testhook append'); 

       // underscore test (WORKS) 
       console.log(_.map([1, 2, 3], function(n){ return n * 2; })); 

       // backbone test (DIES) 
       var artist = new Backbone.Model({ 
         firstName: "Wassily", 
         lastName: "Kandinsky" 
        }); 

        artist.set({birthday: "December 16, 1866"}); 

        console.log(JSON.stringify(artist)); 
      } 

      return { init: init }; 
     } 
); 

Các chính xác đầu ra bàn điều khiển là:

Uncaught TypeError: Cannot call method 'extend' of undefined (backbone.js:150) 
main.js:18 Dom is ready 
app.js:11  app.js > init() 
app.js:17  [2, 4, 6] 
app.js:20  Uncaught TypeError: Cannot read property 'Model' of null (app.js:20) 

NOTE: 
Line 150 in unminified backbone.js is: 
_.extend(Backbone.Model.prototype, Backbone.Events, { 

Tôi đang sử dụng máy tính chạy Windows 7 sử dụng Chrome 17.0.938.0 dev-m.

phiên bản kịch bản của tôi là:

backbone:  0.5.3-optand 
jquery:   1.7 
require:  1.0.1 
underscore:  1.2.2 

cấu trúc thư mục của tôi là:

js 
+-- libs/ 
¦  +-- backbone/ 
¦  ¦  +-- 0.5.3-optamd/ 
¦  ¦     +-- backbone.js 
¦  +-- jquery/ 
¦  ¦  +-- 1.7/ 
¦  ¦   +-- jquery.js 
¦  +-- require/ 
¦  ¦  +-- require.js 
¦  +-- underscore/ 
¦    +-- 1.2.2/ 
¦     +-- underscore.js 
+-- app.js 
+-- domReady.js 
+-- main.js 
+-- order.js 
index.html 

Tôi không thể tin rằng đây là đem lại cho tôi bao nhiêu khó khăn và đang thực sự hy vọng ai đó có thể làm sáng tỏ về những gì heck đang diễn ra ở đây.

+0

ví dụ của bạn làm việc cho tôi 100%. bạn đang sử dụng phiên bản Backbone chính xác nào? optamd hoặc optamd3? – Riebel

Trả lời

20

Tôi thực sự đã dành rất nhiều thời gian để đấu tranh với cùng một vấn đề chính xác này!

Đây là cách tôi đã quản lý để làm cho nó hoạt động ...

Trước hết, tải xuống dự án yêu cầu mẫu mới với jQuery 1.7. Trong tệp zip, bạn sẽ tìm thấy một tệp có tên require-jquery.js bao gồm jQuery 1.7 mà bây giờ là AMD tuân thủ.

Sau đó tải về phiên bản mới nhất của yêu cầu, mà bây giờ cũng AMD, và cuối cùng, hãy thử phiên bản này của Backbone ...

https://github.com/jrburke/backbone/blob/optamd/backbone.js

Burke đã tạo ra này tắt của một ngã ba của xương sống và làm một phiên bản tương thích với AMD.

Sau đó ...
index.htm

<!DOCTYPE html> 
<html> 
    <head> 
     <title>Google Analytics API Browser</title> 
     <!-- This is a special version of jQuery with RequireJS built-in --> 
     <script data-main="main" src="require-jquery.js"></script> 
    </head> 
    <body> 

    </body> 
</html> 

main.js

require(['jquery','order!libs/underscore-min','order!libs/backbone','order!scripts/app'], 
function($,_,Backbone,app){ 
    app.init(); 
}); 

app.js

define(['jquery','backbone','scripts/home'], function($, Backbone, router){ 
    var init = function(){ 
     console.log("Started"); 
      // In here you can load your routers/views/whatever 
    }; 

    return { init: init}; 
}); 

cấu trúc tập tin của tôi trông giống như
/app/index.htm
/app/require-jquery.js
/app/order.js
/app/main.js
/app/text.js
/app/scripts/app.js
/app/scripts/home.js
/app/lib/underscore-min.js
/app/lib/backbone.js

Hãy cho tôi biết nếu điều đó giúp, đánh tôi lên trên twitter @ jcreamer898 nếu bạn cần một số giúp đỡ thêm, Tôi đang làm việc trên cùng một thứ!

CẬP NHẬT Gần đây tôi đã tạo ra một Github 2 dự án github, một ứng dụng thực tế, và một người khác chỉ là một khởi động đơn giản ...

https://github.com/jcreamer898/Savefavs
https://github.com/jcreamer898/RequireJS-Backbone-Starter

+0

Tuyệt vời! Tôi sẽ cho cú đánh này! – greenanvil

+0

Đây là một số mã hoạt động ... https: //github.com/jcreamer898/Savefavs – jcreamer898

+0

Cảm ơn bạn một lần nữa vì thông tin! Có vẻ như một điều quan trọng mà tôi đã bỏ lỡ là đảm bảo gọi trình tự plugin trên ứng dụng chính để đảm bảo nó được tải (và được gọi là backbone/underscore/etc) -after- chúng được tải.Tôi cũng định xem xét đối số cấu hình ưu tiên vì nó có thể giảm thiểu nhu cầu sử dụng thứ tự. Cảm ơn một lần nữa, thực sự. Tôi không quen với việc chạy vào những thứ khiến tôi gặp nhiều rắc rối và muốn tránh đào sâu vào cơ chế cơ bản để xem điều gì đang thực sự xảy ra (hiện tại). Bây giờ tôi có thể lưu nó cho sau này và quay lại với những thứ thú vị! :) Chúc mừng! – greenanvil

0

Sử dụng optamd3 chi nhánh.

+0

Đã sử dụng chi nhánh optamd (xem câu hỏi gốc). Vấn đề có vẻ là vấn đề về đường dẫn và có thể là sự cố đơn đặt hàng ứng dụng chính. Một khi tôi đặt libs chính bên cạnh nhau, ngừng cố gắng sử dụng tùy chọn cấu hình đường dẫn và gửi ứng dụng chính thông qua thứ tự plugin mọi thứ bắt đầu hoạt động như mong đợi. Cảm ơn tho. – greenanvil

5

tôi đã cùng một vấn đề. Thực ra tôi thấy rằng bạn không cần một Backbone hoặc Underscore tương thích với AMD hoặc yêu cầu-jquery hoặc bất kỳ thứ gì khác (ví dụ: thứ tự). Tất cả những gì bạn cần làm là có ứng dụng được định nghĩa trong đường dẫn và thiết lập phụ thuộc của nó trong shim :). Bằng cách nào đó nó được sử dụng để làm việc mà không có nó trong quá khứ.

paths: { 
    app:'app', 
    jquery: '../libs/jquery/jquery.1.9.1.min', 
    underscore: '../libs/underscore/underscore.min', 
    backbone: '../libs/backbone/backbone.min', 
    // ... 
}, 
shim: { 
"app": { 
     deps: ['jquery','underscore','backbone'], 
     exports: 'app' 
}, 
"backbone": { 
    deps: ['jquery','underscore'], 
    exports: 'Backbone' 
}, 
"underscore": { 
    exports: '_' 
} 
//... 

}

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