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

我想在ParentModel中有通用的默认值,要在ParentView中控制默认值并从子视图中调用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中的错误做法吗?
我做什么?

最佳答案

好吧,我认为当您创建新的子视图时,您可以引用父视图:

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/

10-04 15:34