2017-05-03 51 views
0

我是新來的燼,因此我將不勝感激您的協助。我想從我的車把模板傳遞一個焦點拔出事件(見下面的粗體字文本):如何將事件對象作爲參數傳遞(從句柄模板到控制器中的動作)

{{input type="text" class="form-control" **focus-out= (action "ccFocusLost" event**) }} 

要我在我的控制器動作:

ccFocusLost : function(**event**) { 
     alert(event.relatedTarget.tagName); 
    }, 

不過,我得到一個未定義的,當我如上所述。我需要一種方法來獲得焦點調出事件,以便在我的主元素丟失後找出哪個元素將獲得焦點。

在此先感謝!

+0

請參閱我的回答http://stackoverflow.com/a/43736820/5771666可能會提供一些提示。你不能用輸入助手來做這件事。 – kumkanillam

+0

感謝您的回答。你能不能給我一個例子,說明我的上面的例子應該如何修改才能讓我在控制器中獲取事件? – John

+0

我會嘗試使用輸入助手,如果沒有成功,那麼我們需要使用下面的選項,你可以編寫自己的輸入助手,它可以從'Ember.TextField'和'focusOut'方法內部擴展,你可以用'event對象。 – kumkanillam

回答

0

您可以在您的控制器中定義focusOut動作處理程序,並檢查事件是否來自您的input字段,其​​類爲「form-control」。例如。

focusOut(event) { 
    /* if event did not come from desired input field, return here */ 
    /* else call the action as desired to process the focusOut event */ 
} 

或者,您可以創建一個包裝輸入字段的組件,以便您可以在組件級別而不是控制器上定義focusOut事件。這將消除檢查事件是否來自輸入字段的需要。

有關處理在灰燼事件的更多信息,這裏是提供更詳細的指南的部分:Handling Events

+0

感謝您的答案。你能不能給我一個基於我上面的代碼的簡單例子?這將是高度讚賞,因爲即時通訊非常新的Ember – John

+0

我創建一個[示例](https://ember-twiddle.com/ba49f45cbd935f65715cc57f26f8f8dd?openFiles=templates.application.hbs%2Ctemplates.components.input-wrapper.hbs) Ember Twiddle顯示你可以遵循的模式。希望能幫助到你! – zureka

+0

很好的例子,非常有幫助。謝謝。但是,我在工作的項目非常複雜,他們不需要新組件。顯然有一種方法可以做到這一點:或者,「爲模板中的內聯事件處理程序分配一個動作(創建一個閉包動作,並接收事件對象作爲參數)」。如果你能爲我提供一個實現這一目標的方式,我將非常感激。 – John

0

兩件事情

  1. 如果使用focusOut代替focus-out,動作會自動執行包含jQuery事件作爲參數,不需要在模板中指定它。

{{input focusOut=(action "ccFocusLost") }}

  • 在你的代碼,該事件已經被傳遞到你的動作,它只是jQuery的事件的relatedTarget屬性爲null。這是一個jQuery/Javascript事件,unrelated to Ember。另見here
  • 還有很多詳細信息,在那裏上relatedTargets,但現在看來,這將是更好的只是使用document.activeElement

    +0

    感謝您的回答。我試圖用focusOut替換焦點。然而,運行代碼時,Im得到以下錯誤:「運行此代碼時,我收到以下消息:」Uncaught TypeError:無法讀取未定義的屬性'setAttribute'。也許值得注意的是,此項目使用的是ember 1.13。有一個線索,爲什麼會發生這種情況? – John

    1

    很棘手,但這裏是解決方案。我有以下代碼:

    模板(不需要有一個事件參數):

    {{input type="text" class="form-control" **focus-out= (action "ccFocusLost") }}

    控制器:

     ccFocusLost : function() {  
          var targetId= event.relatedTarget.id;  
          alert(targetId); 
         }, 
    

    如此看來,車把可以訪問該事件,而不需要將其作爲參數發送。在這種情況下,如果我按下id = button1的按鈕,警報將顯示button1。

    +0

    'ccFocusLost:function(event)' - 從參數中獲得它否則'事件'可能未定義在'Firefox'中 – kumkanillam

    相關問題