2013-03-25 20 views
12

Here is a simplified plunk to illustrate the problemangularjs: Bir yönerge

içinde önceden gizlenmiş giriş elemanı netlik ayarı bunu görselleştirmek önce bazı html kodunu derler bir açısal direktifini aldık. html olarak, scope.isEditShowntrue yalnızca görülebilir hale gelen bir gizlenmiştir giriş vardır:

<input ng-show='isEditShown' type='text' value='{{content.name}}' class='title_edit'/>

scope.titleChange işlev çağrıldığında giriş görüntülenir. (Bir ng DblClick yönergesi bağlı) Bu fonksiyon sadece scope.isEditShown doğru ayarlar ve daha önceden scope.input = $("input:text", ae); olan bağlayıcı işlevi kapsamı depolanan giriş elemanı (ilgili jQuery'nin focus() yöntemi çağırmak için çalışır: Kısaca

scope.isEditShown = true; 
scope.input.focus(); 

, Bir şey çift tıklandığında önceden gizlenmiş bir girdinin görselleştirilmesini ve anında odaklanmalarını sağlamak istiyorum. Odak odağı kaybettiğinde girdi gizlendiğinden hemen odaklanmak gerekir (kullanıcının giriş içeriğini anında düzenlemesini istiyorum. Kullanıcı tıkladığında, giriş gizlidir.)

Sorun şu ki, giriş öğesi programına odağı veremiyorum. çalışma kolu. Denemeden sonra, scope.isEditShown = true; yürütüldüğünde, girişin henüz görünmediğini (= açısal js'nin DOM'de gösterilmediğini) ve gizli bir girişe scope.input.focus(); ile odaklamanın hiçbir şey yapmadığını fark ettim. Giriş elemanı nihayet gösterildiğinde, odaklanmamış.

İstediğimi yapmanın açısal yolu nedir? Girişimin gösterildiğinden ve ne zaman etkin bir şekilde focus()'u arayabileceğime emin olabilir miyim? NOT: girişe odaklama yapmadan önce scope.$apply() kullanırsam, $apply already in progress istisnasını alırım. Güvenli bir şekilde başvurursam foucus verilemez. Bakınız the plunkr.

(ps: gerçekten anlamak istiyorum, bu yüzden automagicallylar yapamaz kullanacağım arkadaşı libreries olduğumu benim için)

+1

Bir Düşmek veya jsfiddle kodunuzu koyabilir miyim? – ganaraj

+2

sorunu temsil etmek için yeterli kod ile çok basit bir demo yapmak, '$ timeout' – charlietfl

+0

@ganaraj kullanarak deneyin: sadece bir plunkr ile cevabı düzenledi. – janesconference

cevap

13

bazı veriyle değişkene değişiklik yapmak ve beklemek gerekir Karşılık gelen işleme, ünlü setTimeout 0'ı kullanmanız gerekir (dönüşümlü olarak $timeout hizmetinde Angular'de).

İşte bunu nasıl yapacağınızı gösteren bir plunkr.

http://plnkr.co/edit/N9P7XHzQqJbQsnqNHDLm?p=preview

+0

Bu gerçekten çalışıyor. Philosopycal soru: zaman aşımlarına güvenmek doğru mu? Bildiğim tüm javascript edebiyatı kafamda "HAYIR" diye bağırıyor. – janesconference

+0

Javascript tek iş parçacıklı. Ayrıca, oluşturma aşamasının ne zaman yapıldığını bilmenin bir yolu yoktur. Şu andaki tek güvenilir yol, temel olarak javascript'i "her şey bittiğinde en kısa sürede yapın" diye anlatan setTimeout 0'ı kullanmaktır. Ayrıca, bir tarayıcı yüklemesi bittiğinde (olay) çapraz tarayıcı yolu yoktur. Yani evet, bir kesmek gibi görünüyor olsa da, oldukça birkaç yerde kullanılır. – ganaraj

+0

Evet, kooperatif çoklu görevlerde bir süreç-kaynak gibi çalıştığını biliyorum. Bu mantıklıdır: Açısal muhtemelen çalışma tamamlanıncaya kadar yürütme yığınını oluşturmazsa, odaklama() çağrısı gitmeden önce tüm işi yapar. Teşekkür ederim. – janesconference