与RequireJS分裂文件后,Backbone.js的listenTo(型号,'变',回调)回调没有达到 [英] Backbone.js listenTo(model,'change',callback) callback not reached after splitting files with RequireJS
问题描述
我分手了我的工作Backbone.js的应用,转化为模型,视图和路由器单独的文件。
I'm splitting up my working Backbone.js application, into seperate files for models, views and routers.
开始我的路由器:
window.App = Backbone.View.extend({
initialize: function() {
require(["routers/my-router"], function (MyRouter) {
var myRouter = new myRouter();
Backbone.history.start();
});
}
});
在我的路由器文件路由器/我-router.js
,我听一个模型的变化事件:
In my Router file routers/my-router.js
, I am listening to a change event of a Model:
define(function (require) {
"use strict";
var $ = require('jquery'),
_ = require('underscore'),
Backbone = require('backbone');
return Backbone.Router.extend({
initialize: function() {
var self = this;
require([],
function(){
var model = new Backbone.Model.extend({});
self.listenTo(model, 'change', self.callback);
model.trigger('change');
}
);
},
callback: function() {
console.log('callback reached!');
}
});
});
我收到以下错误定义回调不同的方式:
-
self.callback
:未捕获类型错误:未定义不是一个函数
-
回调
:未捕获的ReferenceError:回调没有定义
-
this.callback
:未捕获类型错误:无法读取属性'onManualDestination未定义
self.callback
:Uncaught TypeError: undefined is not a function
callback
:Uncaught ReferenceError: callback is not defined
this.callback
:Uncaught TypeError: Cannot read property 'onManualDestination' of undefined
这个问题是玉蕊的回答后可进行编辑。
This question was edited after Yurui's answer.
推荐答案
确定,几件事情。
执行路由器的初始化方法,你必须创建一个Router实例,然后使用Backbone.history.start(),像这样:
to execute a Router's initialize method, you will have to create a Router instance, and then use Backbone.history.start(), like so:
//define router:
var Router = Backbone.Router.extend({});
//instantiate a router
new Router();
//start router!
Backbone.history.start();
在您的例子中,路由器没有实例化,也开始了。
同时,该模型的变化不会被触发。
In your example, the router is not instantiated, nor started. also, the model change is not triggered.
这是我的工作的例子:
//define a model.
var Model = Backbone.Model.extend({});
//define a router
var Router = Backbone.Router.extend({
initialize: function () {
var self = this;
setTimeout(function () {
var myModel = new Model({});
self.listenTo(myModel, 'change', self.callback);
//triggers change right away so you can see the callback output
myModel.trigger('change');
}, 1000);
},
callback: function () {
console.log('Callback reached!');
}
});
//instantiate the router!
new Router();
//here's when router.initialize() is called.
Backbone.history.start();
请注意:我用的setTimeout
来替换使用 requirejs
,但它不应该在这个例子中有什么影响
NOTE: i used setTimeout
to replace the use of requirejs
but it shouldn't affect anything in this example.
的jsfiddle: http://jsfiddle.net/4KLCZ/
jsfiddle: http://jsfiddle.net/4KLCZ/
这篇关于与RequireJS分裂文件后,Backbone.js的listenTo(型号,'变',回调)回调没有达到的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!