【问题标题】:Using events to communicate between models in backbone使用事件在主干中的模型之间进行通信
【发布时间】:2012-05-07 06:01:32
【问题描述】:

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

有什么想法吗?

谢谢!

【问题讨论】:

    标签: events model backbone.js


    【解决方案1】:

    是的..你有一个错字:

    而不是这个:

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

    使用这个:

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

    在第一种情况下,您正在执行函数 start() 并添加此函数的 return 作为回调,在第二种情况下,您正在向函数添加 reference 作为回调,这是你想要的。

    其实我会用这个:

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

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

    【讨论】:

      【解决方案2】:

      @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/

      【讨论】:

      • 谢谢。这非常有效。我认为那里可能存在某种竞争条件,但无法弄清楚。我从 start 和 end 方法中删除了括号,并按照建议创建了 login 方法。正常工作。谢谢你们。
      猜你喜欢
      • 1970-01-01
      • 2015-05-30
      • 2013-02-17
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多