2012-12-19 45 views
8

Đây là lần đầu tiên tôi sử dụng require.js với xương sống, và tôi đang phải vật lộn để tìm ra vấn đề với quan điểm của tôi:không thể đọc thuộc tính 'Xem' không xác định

Cannot read property 'View' of undefined // search.js:8 

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

. 
├── index.php 
└── js 
   ├── app.js 
   ├── lib 
   │   ├── backbone.js 
   │   ├── backbone-min.js 
   │   ├── jquery-min.js 
   │   ├── require.js 
   │   └── underscore-min.js 
   ├── main.js 
   ├── model 
   ├── router.js 
   ├── text.js 
   └── view 
    ├── error.js 
    └── search.js 

My main.js:

require.config({ 
    paths: { 
    jquery: 'lib/jquery-min', 
    underscore: 'lib/underscore-min', 
    backbone: 'lib/backbone-min', 
    templates: '../templates' 
    } 

}); 

require([ 
    'app' 
], function(App){ 
    App.initialize(); 
}); 

My app.js:

define([ 
    'jquery', 
    'underscore', 
    'backbone', 
    'router', // Request router.js 
], function($, _, Backbone, Router){ 

    var initialize = function(){ 
    // Pass in our Router module and call it's initialize function 
    Router.initialize(); 
    } 

    return { 
    initialize: initialize 
    }; 
}); 

My router.js:

define([ 
    'jquery', 
    'underscore', 
    'backbone', 
    'view/search', // requests view/search.js 
], function($, _, Backbone, SearchView){ 

    var AppRouter = Backbone.Router.extend({ 
    routes: { 
     "": "home" 
    } 
    }); 

    var initialize = function(){ 
    var app_router = new AppRouter; 
    app_router.on('route:home', function(){ 
     var homeView = new SearchView(); 
     homeView.render(); 
    }); 
    Backbone.history.start(); 
    }; 
    return { 
    initialize: initialize 
    }; 
}); 

view/search.js tôi:

define([ 
    'jquery', 
    'underscore', 
    'backbone', 
    'text!templates/search.html' 
], function($, _, Backbone, searchTemplate){ 

    // console.log($,_,Backbone); 

    var SearchView = Backbone.View.extend({ 
    ... 
    }); 

    return SearchView; 
}); 

Khi tôi uncomment các console.log trên, cả hai _Backboneundefined nhưng $ thì không. Tôi đã bỏ lỡ điều gì? Tất cả các tệp lib của tôi đều có phiên bản mới nhất.

Trả lời

12

Xương sống và Gạch dưới không tương thích với AMD. Theo mặc định, chúng không cung cấp một giao diện tương thích với RequireJS.

Trong các phiên bản trước, RequireJS provide a useful way to solve the problem:

main.js của bạn:

require.config({ 
    shim: { 
    underscore: { 
     exports: '_' 
    }, 
    backbone: { 
     deps: ['underscore', 'jquery'], 
     exports: 'Backbone' 
    } 
    }, 
    paths: { 
    jquery: 'lib/jquery-min', 
    underscore: 'lib/underscore-min', 
    backbone: 'lib/backbone-min', 
    templates: '../templates' 
    } 

}); 

require([ 
    'app' 
], function(App){ 
    App.initialize(); 
}); 
+0

Cảm ơn bạn vì đã cứu tôi suốt ngày! BTW, gạch dưới cần phải được xuất khẩu là tốt. – Michelle

+0

Thật vậy, tôi sẽ thêm nó. – BAK

0

Để mở rộng câu trả lời BAK, bạn sẽ cần phải cung cấp một baseUrl quá:

require.config({ 
    baseUrl: 'js', 
... 
}); 
Các vấn đề liên quan