2013-04-30 17 views
16

Öznitelikler içinden yönerge değerlerine nasıl erişilebileceği hakkında bir fikriniz var mı?AngularJs yönergeleri - öznitelikler içinden öznitelik değerlerinin nasıl elde edileceği

angular.module('portal.directives', []) 
     .directive('languageFlag', ['$routeParams', function(params) { 
      return function(scope, element, attrs) { 
       console.log(attrs["data-key"]); // returns undefined 
       console.log(element.attr('data-key')); // returns {{data-key}} 
       angular.element(element).css('border', '1px solid red'); 
      }; 
     }]); 

Html kodu:

<ul> 
    <li ng-repeat="lng in flags"> 
     <a class="lngFlag {{flag.Key}}" data-key="{{flag.Key}}" data-id="{{lng.Id}}" ng-click="changeLangHash({'lng':lng.Id })" language-flag></a> 
    </li> 
</ul> 

Teşekkür

+0

Sadece dash-cizgisini takip et - –

cevap

23

Kullanım $observe:

interpolasyon gözlemleyerek özellikleri: interpolasyon içeren niteliklerin değeri değişiklikleri gözlemlemek için kullanımlar $observe (ör src="{{bar}}"). Sadece bu çok verimli olmakla kalmaz, aynı zamanda gerçek değeri kolayca elde etmenin tek yolu, çünkü bağlantı aşamasında, enterpolasyon henüz değerlendirilmemiştir ve bu nedenle değer bu zamanda undefined olarak ayarlanmıştır. - bu özellik adını, yerine dataKey daha yukarıda key dolayısıyla kullanımı, normalleştirir zaman directives doc

return function(scope, element, attrs) { 
    attrs.$observe('key', function(value) { 
     console.log('key=', value); 
    }); 
} 

bir yorumda bahsedilen @FMM olarak, data Açısal ile sıyrılmıştır.

+1

Teşekkürler. Yılan notasyonlarına sahip olanlar hariç tüm özelliklerde çalışır. Veri-şey gibi. Ama cevabını kabul ediyorum çünkü aslında diğer niteliklerle çalışıyor. Çabalarınızı ve zamanlarınızı takdir ediyorum. –

+2

Açısal, 'data' önekini kırpıyor olabilir (http: //docs.angularjs.org/guide/directive): "İsteğe bağlı olarak yönerge, HTML doğrulayıcıyı uyumlu hale getirmek için x- veya data- ile öneklenebilir." Muhtemelen (mantıksal) öznitelik adlarını "veri" ile başlatmak kötü bir fikirdir. – FMM

10

attrs["dataKey"] deneyin - bu html çizgi (-) ile özelliklerini ayrıştırma yoludur. yerine {{something}} kapsamından değer istiyorsanız, yapabileceğiniz iki şey:

scope[attrs['dataKey']] - çalışacaktır ancak `kullanmayın sonra bu

yapmak ya $parse kullanmak ancak olmamalıdır` {{ }} `

app.directive('languageFlag', ['$routeParams','$parse', function(params,$parse) { 
    return function(scope, element, attrs) { 
    var value = $parse(attrs.dataKey)(scope); 
    console.log(value); 
    angular.element(element).css('border', '1px solid red'); 
    }; 
}]); 

veya aynı yolu $parse gibi ama $interpolate kullanabilirsiniz {{}}

+0

Yanıtlama için teşekkürler. console.log (attrs ["dataKey"]); // = undefined console.log (kapsam [attrs ['dataKey']]); // = undefined Tüm {{}} öğelerini kaldırdım ve denedim. $ ayrıştırma işlemlerini kaldırdım ancak yine de "tanımlanmamış". Temel modele bağlama zamanında basitçe erişmenin bir yolu yok mu? –

+0

Ana kapsamın $ parse (ex: '$ ayrıştırma (attrs.uid) ($ scope. $ Parent)') için geçirilmesi sorunumu çözdü – manikanta

+0

@ g00fy Ancak, öznitelik iki yönlü bir bağlanmış değerse ne olur? Kodum, yalnızca yönerge yüklemesinde ayrıştırır, ancak değişkendeki değişikliklerin (üst kapsamdan) yapıldığını asla fark etmez. –

1

Sana attrs parametresini alır direktifin bağlantı işlevinin içinden ise nesne gösterimi kullanılarak öneririm:

4

açısal şeritler 'veriye' hiçbir özelliğe kapalı, eğer öyleyse

attrs.yourAttributeName özniteliğiniz 'data-key', 'dataKey' değil 'dataKey' seçeneğini kullanın, 'dataKey' değil

+0

Sadece actiontype ile "data-actiontype" isminde bir özn var. Bu öznitelikten veri alamıyorum. Bu isim önceden tanımlanmış mı? – Kathir

+0

@Kathir Kodunuzu görmeden söylemek zor. Umarım 14 saat önce sorduğun için bunu anladın. Eğer değilse, bu sayfadaki cevaplara bakabilmeniz ve birkaç farklı şeyi denemelisiniz. –

+0

Cevabınız için teşekkür ederiz. Lütfen aşağıda bulunan etiketimi görüyorum 'Şu anda Etiketten 'data-' çıkarılıyor. Hala anlayamadım. – Kathir

İlgili konular