这是易于理解的形式呈现,所以请享受阅读 :)
我有一个主干应用程序,它通过main.js文件进行初始化,如下所示:
重要的是,在这里的第一行中,我正在要求。
登出视图如下,这里我来到了问题的本质:
在main.js文件中。
但似乎存在一个require问题,因为require正在尝试获取程序的第一行中的所有文件:
然后我遇到了这个错误:
这应该在运行main.js文件后定义,但是由于require正在获取文件并在LogoutView中找不到定义的App变量,因此它甚至无法进行。
我可以通过在视图的initialize函数内定义模型来解决这个问题,如下所示:
但是我真正想要的是理解为什么会出现这个错误,以及使用Backbone.js和Require.js创建全局模型的最佳实践。
我有一个主干应用程序,它通过main.js文件进行初始化,如下所示:
require([
'backbone',
'app',
'models/session'
], function (Backbone, Application, SessionModel) {
//new Application();
window.App = {
session: new SessionModel()
};
new Application();
Backbone.history.start();
});
正如您所见,requirejs将'app'作为第二个参数进行了要求。
App只是一个路由器,看起来像这样(已删除不太重要的部分)
define(function(require){
'use strict';
var Backbone = require('backbone'),
Header = require('views/header'),
Login = require('views/login');
var Router = Backbone.Router.extend({
initialize: function(){
this.header = new Header();
this.header.render();
},
routes: {
'login': 'showLogin'
},
showLogin: function() {
this.showView(new Login(), {requiresAuth: false});
this.header.model.set('title', 'Login');
},
showView: function(view, options) {
if(this.currentView) this.currentView.remove();
$('.content').html(view.render().$el);
this.currentView = view;
return view;
}
});
return Router;
});
重要的是,在这里的第一行中,我正在要求。
Header = require('views/header');
头部视图在标准方式下需要另一个视图:
LogoutView = require('views/logout');
登出视图如下,这里我来到了问题的本质:
define(function(require){
'use strict';
var Backbone = require('backbone'),
JST = require('templates')
return Backbone.View.extend({
model: App.session,
template: JST['app/scripts/templates/logout.hbs'],
events: {
'submit form': 'logout'
},
initialize: function(){
this.listenTo(this.model, 'change', this.render)
},
render: function(){
this.$el.html(this.template(this.model.toJSON()));
return this;
},
logout: function(e){
//nothing important here
}
});
});
正如您在Backbone.View.extend之后的第一行所看到的,我正在尝试定义视图的model属性:
model: App.session,
我认为应该可以访问,因为我正在定义:
window.App = {
session: new SessionModel()
};
在main.js文件中。
但似乎存在一个require问题,因为require正在尝试获取程序的第一行中的所有文件:
require([
'backbone',
'app', <<--- in this line it's trying to get all the files required in the app.js
'models/session'
], function (Backbone, Application, SessionModel) {
然后我遇到了这个错误:
Uncaught ReferenceError: App is not defined logout.js:8
这正是试图访问App全局变量的代码行:
model: App.session,
这应该在运行main.js文件后定义,但是由于require正在获取文件并在LogoutView中找不到定义的App变量,因此它甚至无法进行。
我可以通过在视图的initialize函数内定义模型来解决这个问题,如下所示:
initialize: function(){
this.model = App.session;
this.listenTo(this.model, 'change', this.render)
},
但是我真正想要的是理解为什么会出现这个错误,以及使用Backbone.js和Require.js创建全局模型的最佳实践。