使用事件在骨干模型之间进行通信

时间:2012-05-07 06:01:33

标签: events model backbone.js

我很难搞清楚为什么这不起作用。我在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()在实例化后立即被触发。我不知道我是否正确添加了听众。

有什么想法吗?

谢谢!

2 个答案:

答案 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"
});

此处的工作代码:http://jsfiddle.net/mbuchetics/Ujh72/3/