2013-05-11 66 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作爲上下文事件監聽器 - 除非你特別想要別的東西出現在我的實踐中很少發生。