2013-05-11 42 views
1

我使用backbone.js和require.js,并且拥有一个父视图和两个子视图。在众多视图中使用backbone.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中这是不实际吗? 我做什么?

回答

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/

0

你'听说改变事件而没有给它上下文 - 因此this里面的change不是一个视图实例。要解决更改事件申购代码如下:

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

事实上,它总是好主意,通过this作为上下文事件监听器 - 除非你特别想要别的东西出现在我的实践中很少发生。

相关问题