2016-03-31 12 views
1

Kapsayıcının içindeki tüm giriş öğelerini devre dışı bırakacak bir yönerge oluşturmaya çalışıyorum, ancak öznitelikle ilgili sorun yaşıyorum. Bu benim yönergesiBoole özniteliği ile bool özniteliği geçirme dizgisi yerine bool

Direktifi ne getirdim

angular.module('common') 
    .directive('bdDisabled', [function() { 
      return { 
       restrict: 'A', 
       scope: { 
        bdDisabled: '=' 
       }, 
       link: function (scope, element, attrs) { 
        attrs.$observe('bdDisabled', function(newValue, oldValue) { 
         if (newValue !== oldValue) { 
          if (newValue) { 
           element.find('input, select, button, submit, textarea').prop('disabled', 'disabled'); 
          } else { 
           element.find('input, select, button, submit, textarea').removeProp('disabled'); 
          } 

         } 
        }); 
       } 
      }; 
     } 
    ]); 

Bu onu kullanmak istiyorum nasıl olduğunu:

<div class="cg-content cg-shadow" bd-disabled="isLoading"> 

sorun özellik değeri dize olmasıdır isLoading ve değeri değil.

Köşeli parantezler halinde sarılır ve koparsa konsolda bir hata olur. Köşeli parantezler halinde sardım ve '=' yerine kapsamı değiştirirseniz, çalışır. Ama "true" veya "false" dizesini gönderir, boolean değerini değil.

Neredeler?

+0

neler kapsamı. $ watch 'ile" attrs. $ observe "anahtarını değiştirirseniz olur? –

+0

Denemeyi deneyeceğim, – Smeegs

+0

numaralı telefonu kullanarak tek yönlü bağlantı dizgisini geçmek için kullanıyorum. Bunu boolean'a ayrıştırabilirsiniz, aksi halde = olarak değiştirirsiniz; bu, iki yönlü ciltleme nesnesi olan – dannielum

cevap

1

Açıklamada önerdiğim gibi, attrs.$observe'u scope.$watch ile değiştirirdim. Kişisel bir tercihte, bir dize yerine işlev ifadesini de kullanacağım, çünkü örneğin (veya kullanacağınız) yazı tiplerini kullanıyorsanız, özellik değiştiğinde bildirim alacaksınız; şudur: den size kapsamı tanımı değişti

scope.$watch(function() { 
     return scope.bdDisabled; 
     }, 
     function (newVal, oldVal) { 
      ... 
     } 
); 
+0

Üzgünüz, ancak bu işlevi '$ watch' ve TypeScript'inizde kullanmanın uygunluğunu göremiyorum? Olmaksızın ya da olmadan mümkündür. – ste2425

+1

@ ste2425 Söylediğim şey, örneğin, Typescript'i kullanıyorsanız ve JS hataları üzerine kurulmayacak bir derleyici oluşturuyorsa, izlediğiniz değişkenin adını değiştirdiğinizde yapının başarısız olmasına neden olacaktı. Fonksiyondaki değişken (bu değişken artık bilinmeyeceğinden).Eğer dizgede yazılmıştır, yani 'bdDisabled' ise, derleme hala başarılı olacaktır. Bu sadece bir örnekti. Bir model veya kapsam özelliğini izlemek istediğinizde –

+0

$ izle kullanılır. Durumunuzda E.g bd-disabled = "isLoading", kapsam. $ Watch (attrs.bdDisabled) veya scope.watch ('isLoading'). $ gözlem, yalnızca bir DOM özniteliğinin değer değişimini izleyerek enterpolasyonu kullanarak çalışmak istediğinizde çalışır. Örneğin, firstName = "Mr: {{firstName}}" direktifinizdeki attrs. $ gözlemlemek ('firstName') bu durumda $ kapsam. $ izle işe yaramaz. – Venkat

-1

'=' ile gözlemlemek zorunda değilsiniz. Ayrıntılar için aşağıdaki bağlantıya bakın. Dokümanlardan çok daha sağlam olduğuna inanıyorum.

What is the difference between '@' and '=' in directive scope in AngularJS?

Bildiğim kadarıyla kodunuzu giderse, ben bir boolean olduğundan emin olmak için isLoading değişkeni iki kez kontrol ederim.

+0

Merhaba, kesinlikle bir boole. Bir dizge olarak işlenmesinin nedeni, onu iletirken bir dizge olarak çeviren '@' dir. – Smeegs

+0

@Smeegs benim hatam, bunu okuduğumda kodunuza bakıyordum. – rabruce

-1

"=" "@" için, sadece bir dize değil, İki Yönlü-Bind modu olarak geçmek istiyorum. Tabii, sizin gibi gerçekten true o dönüştürebilirsiniz:

var myBool = Boolean("false"); // === true

var myBool = Boolean("true"); // === true

Ama herhangi bir dize gibi true olarak düşünün çünkü buna dikkat:

var myBool = Boolean("foo"); // === true

+1

Boolean ('false') doğru – zeliboba

+0

Katılıyorum, benim kötü, sadece JS sorunu hakkında unuttum, niyetim sadece AngularJS –

+0

kapsam tanımlarını göstermek oldu Sadece cevap lütfen düzeltin. Azınlık yorumları okur. – zeliboba