2013-11-25 36 views
1

我必須在render()函數中使用​​變量,但我只能將它傳遞給構造函數。我這個代碼:在將render作爲回調函數時訪問視圖屬性

app.views.CompanyView = Backbone.View.extend({ 
    el: '#company-view', 
    guid: '', 

    initialize: function (options) { 
     this.guid = options.guid; 
    }, 

    render: function() { 
     var guid = this.guid; 
    } 
}); 

創建我的看法是這樣的:

app.currentView = new app.views.CompanyView({guid: guid}); 

然後我通過render()函數作爲參數傳遞給使用它作爲一個回調:

function call(callback){ 
    callback(); 
} 

call(app.currentView.render); 

我試着this.guid,optionsthis.options,但都是undefined。有沒有辦法將這個變量傳遞給render()函數而不使用它的參數或全局變量?這是一個JsFiddle example

+2

似乎按預期http://jsfiddle.net/nikoshr/cn8nN/ – nikoshr

+1

您應該能夠訪問this.guid在渲染(),除非渲染()被調用由其他對象。在這種情況下,你需要添加_.bindAll(this,「render」);在你初始化。 –

+0

@nikoshr我發現只有當我使用render函數作爲回調時纔會出現問題。更新你的小提琴,所以現在它再現了我的問題。 – totymedli

回答

2

當你調用render通過這樣的:

function call(callback){ 
    callback(); 
} 

你調用它作爲一個普通的功能,所以thisrenderwindow。請記住,JavaScript中的this取決於如何調用函數,而不是如何定義函數(除非您正在玩綁定函數)。

你有一些選擇:

  1. 綁定render使用_.bindAll_.bind$.proxyFunction.bind認爲,...

    initialize: function() { 
        _.bindAll(this, 'render'); 
    } 
    

    演示:http://jsfiddle.net/ambiguous/GsUfY/

  2. 越現在常見的做法是將功能傳遞給上下文,然後誰調用回調使用callapply使用適當的上下文:

    function call(callback, context){ 
        callback.apply(context); 
    } 
    

    演示:http://jsfiddle.net/ambiguous/LnwPr/

  3. 動手做做看手:

    call(function() { v.render() }); 
    

    這其中通常採取的形式var _this = this;後面跟着一個匿名函數,它使用_this.some_method()而不是僅僅傳遞this.some_method作爲回調。

    演示:http://jsfiddle.net/ambiguous/K2Xj4/

我更喜歡第二個選項。

2

我明白了。當你的render()被回調函數調用時,方法的調用者不再是視圖本身,因此你的render中的「this」將是調用函數()的調用者。

看到這個小提琴:

http://jsfiddle.net/cn8nN/2/

var CompanyView = Backbone.View.extend({ 
    initialize: function (options) { 
     this.guid = options.guid; 
    }, 

    render: function() { 
    console.log('hello'); 
    console.log(this); 
    } 
}); 

var v = new CompanyView({guid: 'the guid'}); 

function call(callbcak) { 
    callbcak(); 
} 

call(v.render); 

,如果你打開控制檯,你會看到 「本」 實際上是窗口的。

要解決這個問題,你想綁定上下文到它自己的視圖。

要做到這一點,請使用_.bindAll();

initialize: function (options) { 
    _.bindAll(this, "render"); 
    this.guid = options.guid; 
} 

的jsfiddle:http://jsfiddle.net/cn8nN/3/

相關問題