Это представлено в легко понять моду, так что наслаждайтесь чтением :)Создания/Доступ к глобальному объекту с requirejs и backbonejs
У меня есть магистральное приложение, которое инициализируется с 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 только маршрутизатор, который выглядит примерно так (менее важными деталями были удален)
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: App.session,
, который я полагаю, должен быть доступен, потому что определяло:
window.App = {
session: new SessionModel()
};
в файле main.js.
Но, кажется, что существует проблема требует, потому что, как требуют пытается получить все файлы в первых строках программы:
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, но оно даже не заходит так далеко, как требует получение файлов и находит не определенную переменную App в LogoutView.
я могу обойти эту проблему, определив модель внутри функции инициализации в представлении, как так:
initialize: function(){
this.model = App.session;
this.listenTo(this.model, 'change', this.render)
},
Но что я действительно хочу, чтобы понять, почему происходит эта ошибка, и что является лучшей практикой создания глобальных моделей с использованием Backbone.js и Require.js.
Да, спасибо за ответ, я знал, что происходит, но спасибо за очки, это поможет другим с проблемой точно. Итак, вы говорите, что нет возможности иметь глобальную переменную за пределами области requirejs, и вам нужно ее присоединить к ней? – matewilk
У вас могут быть глобальные переменные, вам просто нужно знать порядок, в котором эти файлы включены. Я предпочитаю иметь модуль, посвященный этим переменным, которые я могу включить по своему усмотрению, и это не загрязняет глобальную область. – nikoshr
Да, я имел в виду наличие переменных в глобальной области, не загрязняя их, что немного противоречиво. Но да, вы правы, лучше не загрязнять глобальную сферу. Спасибо, что освободили! О да, и еще одна вещь, это синглтон, который вы показали в первом фрагменте кода? Похоже, он возвращает новый SessionModel (NEW) каждый раз, когда вы его требуете. Или это какая-то магия requirejs? – matewilk