1

我将backbone.js 与require.js 一起使用,并且有一个父视图和两个子视图。

我想在 ParentModel 中有共同的默认值,有共同的逻辑来控制 ParentView 中的默认值并从子视图中调用 ParentView 逻辑。代码在这里。

父视图.js

 define(
  ['jquery', 'underscore', 'backbone', 'models/parentModel'],
  function($, _, Backbone, ParentModel) {

    var ParentView = Backbone.View.extend({
      model: new ParentModel(),
      initialize: function() {
        this.model.on("change:hoge", this.switchHoge);
      },
      parentSet: function(k, v) {
        // context is childen model
        // want to set parent model
        this.model.set(k, v);
      },
      switchHoge: function(k, v) {
        if (this.model.get("view") == "A") {
          console.log("aaaaaaaaaaaa");
        } else if (this.model.get("view") == "B") {
          console.log("bbbbbbbbbbbb");
        }
      }
    });

    return ParentView;
  }
);

childView_A

  var ChildView_A = ParentView.extend({
    model: new ChildModel_A(),
    change: function() {
      this.parentSet("hoge", "A");
    }
  }

childView_B.js

var ChildView_B = ParentView.extend({
  model: new ChildModel_B(),
  change: function() {
    this.parentSet("hoge", "B");
  }
});

parentSet 上下文被子模型替换是一个问题。所以绑定在 ParentView 中的函数不会被调用。

如果我将 ParentView:model 重命名为 ParentView:another_model,我可以解决这个问题。

但似乎并不美丽。

这是 Backbone.js 中的不良做法吗?我该怎么办?

4

2 回答 2

0

您正在收听更改事件而不给它上下文 - 因此this里面change不是视图实例。要修复更改您的事件订阅代码,如下所示:

this.model.on("change:hoge", this.switchHoge, this);

实际上,将this上下文作为上下文传递给事件侦听器总是一个好主意——除非你特别想要那里的其他东西,而且在我的实践中它很少发生。

于 2013-05-11T18:39:05.657 回答
0

好吧,我认为您可以像这样创建新的子视图时参考您父母的视图:

var Parent = new ParentView({model: model});

var Child_A = new ChildView_A({parent: Parent});

然后在您的chieldview中您可以执行以下操作:

this.options.parent.parentSet("hoge", "A");

这应该使用您的父视图的上下文调用该方法。

您还可以在子视图的初始化方法中添加这一行,以便更轻松地访问您的父视图:

this.parentView = this.options.parent;

这是一个工作小提琴:

http://jsfiddle.net/5JRZe/2/

于 2013-05-11T11:21:42.360 回答