2012-12-19 76 views
8

财产“查看”这是我第一次使用require.js与骨干,我努力寻找我的观点的问题:无法读取的不确定

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

我的目录结构是:

. 
├── 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 

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(); 
}); 

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 
    }; 
}); 

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

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

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

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

    return SearchView; 
}); 

当我注释掉上面的console.log,既_Backboneundefined$不是。我错过了什么?我所有的lib文件都是最新版本。

回答

12

Backbone和Underscore不符合AMD标准。默认情况下,它们不提供与RequireJS兼容的接口。

在过去的版本中,RequireJS provide a useful way to solve the problem

你main.js:

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

谢谢为了节省我的一天先生! BTW,下划线也需要导出。 – Michelle

+0

的确,我会加上它。 – BAK

0

为了延长比克的答案,你需要提供的baseUrl太:

require.config({ 
    baseUrl: 'js', 
... 
});