1

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

有任何想法吗?

谢谢!

4

2 回答 2

2

是的..你有一个错字:

而不是这个:

this.session.on("start", this.start());

用这个:

this.session.on("start", this.start);

在第一种情况下,您正在执行该函数start()并将return该函数的作为回调添加,在第二种情况下,您正在添加对该函数的引用作为回调,这就是您想要的。

其实我会用这个:

this.session.on("start", this.start, this);

发送正确的绑定来执行this.start().. 但这是另一个故事 :)

于 2012-05-07T08:16:12.130 回答
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/

于 2012-05-07T09:32:24.050 回答