我很难搞清楚为什么这不起作用。我在Backbone中有两个模型,我想通过移动到一个公平的设置来解耦。向您展示更容易:
var Session = Backbone.Model.extend({
url: '/some/url/session.js',
initialize: function(credentials) {
if (this.isValid() == true) {
this.trigger("start");
}
},
validate: function() {
if (this.get("user") != "user" || this.get("password") != "pass") {
this.trigger("end");
return "Invalid credentials.";
}
}
});
var MainModel = Backbone.Model.extend({
url: '/some/url/config.js',
initialize: function(credentials) {
this.session = new Session(credentials);
this.session.on("start", this.start());
this.session.on("end", this.end());
},
end: function() {
console.debug("session ended");
},
start: function() {
console.debug("session started");
}
});
new MainModel({
"user":"user",
"password": "pass"
});
我看到的问题是MainModel.start()和MainModel.end()在实例化后立即被触发。我不知道我是否正确添加了听众。
有什么想法吗?
谢谢!
答案 0 :(得分:2)
是..你有一个错字:
而不是:
this.session.on("start", this.start());
使用此:
this.session.on("start", this.start);
在第一种情况下,您正在执行函数start()
并将此函数的return
添加为回调,在第二种情况下,您要将引用添加到函数是回调,这就是你想要的。
其实我会用这个:
this.session.on("start", this.start, this);
发送正确的绑定以执行this.start()
..但这是另一个故事:)
答案 1 :(得分:1)
@fguillen是正确的,你需要绑定函数this.start
而不是函数调用的结果。
此外,绑定的顺序也不正确。您正在Session.intialize
中验证用户,但此时尚未创建绑定。我建议添加一个单独的login()
函数,在绑定事件后调用它:
var Session = Backbone.Model.extend({
url: '/some/url/session.js',
login: function(credentials) {
if (this.isValid() == true) {
this.trigger("start");
}
},
validate: function() {
if (this.get("user") != "user" || this.get("password") != "pass") {
this.trigger("end");
return "Invalid credentials.";
}
}
});
var MainModel = Backbone.Model.extend({
url: '/some/url/config.js',
initialize: function(credentials) {
this.session = new Session(credentials);
this.session.on("start", this.start);
this.session.on("end", this.end);
this.session.login();
},
end: function() {
console.debug("session ended");
},
start: function() {
console.debug("session started");
}
});
new MainModel({
"user":"user",
"password": "pass"
});