Помещение Backbone.js в анонимные закрытия javascript - PullRequest
0 голосов
/ 01 марта 2012

Я пытаюсь поместить все мои файлы backbone.js в анонимные закрытия javascript, чтобы я мог немного лучше структурировать свой код и интегрировать require.js в будущем.

Вот пример того, что яя пытаюсь сделать (показаны только 2 файла, но я хочу сохранить ту же структуру для остальных):

main.js ДО:

Backbone.View.prototype.close = function () {
console.log('Closing view ' + this);
if (this.beforeClose) {
    this.beforeClose();
}
this.remove();
this.unbind();
};

var AppRouter = Backbone.Router.extend({

initialize: function() {
    $('#header').html( new HeaderView().render().el );
},
  ...etc etc

main.js ПОСЛЕ (с анонимным закрытием):

(function(AppRouter){
Backbone.View.prototype.close = function () {
console.log('Closing view ' + this);
if (this.beforeClose) {
    this.beforeClose();
}
this.remove();
this.unbind();
};

//HERE, no way to instantiate AppRouter, won't work
var app = new AppRouter();

initialize: function() {
    $('#header').html( new HeaderView().render().el );
},
  ...etc etc
})(app);

app-router.js ДО

var AppRouter = Backbone.Router.extend({

initialize: function() {
    $('#header').html( new HeaderView().render().el );
},
  ...etc etc

app-router.js ПОСЛЕ (с анонимным закрытием)

(function(){
var AppRouter = Backbone.Router.extend({

initialize: function() {
    $('#header').html( new HeaderView().render().el );
},
...etc etc
})(AppRouter);

, поэтому app-router.js включен перед main.js, почему объект AppRouter 'undefined' в моем коде main.js?Я никак не могу создать экземпляр этого объекта.

1 Ответ

1 голос
/ 01 марта 2012

переменная приложения определяется внутри функции в main.js и передается в ту же функцию, где она недоступна.

е

(function(AppRouter){ .....

var app = new AppRouter();

....}(app)

вам нужно передать AppRouter при вызове функции

(function(AppRouter){ .....

var app = new AppRouter();

....}(AppRouter)

также в соответствии с приложением-маршрутизатором AppRouter недоступен в глобальном контексте, поэтому вам нужно вернуть расширенный объект, как следует, тогда он будет доступен через приложение

var AppRouter = (function(){
return Backbone.Router.extend({

initialize: function() {
    $('#header').html( new HeaderView().render().el );
},
...etc etc
})();
...