2016-09-13 24 views
1

在灰燼與閉合動作,你可以通過一個函數,就像這樣:EmberJS 2.7 - 使用閉合動作來調用一個函數VS調用該函數作爲一個動作

<div class="dropzone text-center" {{action (action openFilePicker)}}> 
<!-- this calls a function (no quotes!) --> 
    </div> 

而不是調用一個動作,如下所示。

<div class="dropzone text-center" {{action (action 'openFilePicker')}}> 
<!-- this calls an action (quotes!) --> 
    </div> 

在(1)背襯此組件的代碼看起來是這樣的:

openFilePicker: function() { 
    let child = this.$('div:first-child'); 
    child.removeClass('is-dragging'); 
    child.html('<h2>Upload GPX Route</h2><div class="dropzone-body-text"><h5>Drag and Drop here</h5>- or -<h5>click anywhere here</h5></div>'); 
    filepicker.pick({ 
     container: 'modal', 
     maxSize: (5 * 1024 * 1024), 
     services: ['COMPUTER'] 
    }); 
    } 

這使用JQuery的除去從DOM一些元素,然後調用另一個函數(filepicker。選擇)這是在外部加載的JS文件。

在(2)相同的代碼是一個動作裏面:

actions: { 
    openFilePicker: function() { 
     let child = this.$('div:first-child'); 
     child.removeClass('is-dragging'); 
     child.html('<h2>Upload GPX Route</h2><div class="dropzone-body-text"><h5>Drag and Drop here</h5>- or -<h5>click anywhere here</h5></div>'); 
     filepicker.pick({ 
      container: 'modal', 
      maxSize: (5 * 1024 * 1024), 
      services: ['COMPUTER'] 
     }); 
    } 
} 

什麼是這樣做的利弊?我知道(1)不是推薦的方式,但(1)可以更容易地訪問component中的其他代碼(例如組件的屬性)。像往常一樣,Ember文檔似乎沒有揭示這一點(不是我可以找到)。我所能找到的是this blog post這使得不鼓勵調用任意函數(否則爲什麼首先要採取行動?)

所以,儘管這個問題可以導致意見,但這不是我所追求的。我想了解這兩種方法之間的區別是什麼?例如,當你在INSIDE函數內部時,從JS運行時的角度來看,它有什麼區別?例如,在這兩種情況下,「這個」都是一樣的嗎?

+0

爲什麼更容易訪問組件的其他代碼? Ember將把你的行爲綁定到你的組件上。 – Lux

+0

如果在要調用另一個函數的組件內部的函數內部(如在您爲該組件使用而加載的動態加載的外部文件中 - 這是插件的常見場景),該怎麼辦。 '這'不再受限制,對吧?在調用嵌套函數(我想!)之前,你必須讓myComponent = this在行動中。 – rmcsharry

+0

@Lux事實證明它不會讓它更容易:)這是我的誤解。 – rmcsharry

回答

1

這沒什麼區別。結帳this旋轉。

唯一的區別就是動作查找時間。雖然{{action 'foo'}}要求foo在綁定時間內存在,但這不是={{action 'foo'}}(封閉操作)所必需的。

動作調用受限於當前的this上下文。這基本上是關閉操作的輔助工具。它會創建一個新函數,在對{{action}}幫助程序進行評估時,將this作爲上下文來調用原始函數。

如果您在當前功能範圍外調用另一個功能this總是會有所不同。 重要的是要明白,this總是綁定到函數作用域。

如果您調用類似myfunction()的函數,那麼this內部的該函數將爲null。如果您撥打foo.myfunction()之類的功能,則myfunction內的this將爲foo

請確保您完全理解this。簡而言之,this在Ember中沒有什麼不同。這是標準的Javascript。

+0

非常感謝你給出了一個很好的解釋 - 而這個小小的旋律確實有幫助。出於某種原因,我認爲Ember正在做一些關於'this'的關閉動作,但是我現在看到,就像你說的那樣,它只是標準的JS。 – rmcsharry

相關問題