2015-06-22 15 views
9

Nie mogę przekazać wartości boolowskiej do mojej dyrektywy.AngularJS: przekazywanie wartości boolowskiej do dyrektywy

Oto moja HMTL:

<city-zip city="clientCity" zip="clientZip" requiredParam="'true'"></city-zip> 

i dyrektywy:

.directive('cityZip', function() { 
    return { 
     restrict: 'E', 
     templateUrl: '../templates/templateCityZip.html', 
     scope: { 
      city: '=', 
      zip: '=' 
     }, 
     controller: function($scope) {} 
    } 
}); 

Każda pomoc będzie mile widziane.

+0

Po prostu utwórz zmienną zakresu, aby to sprawdzić. Nie trzeba przekazywać jako ciąg. Powinieneś przekazać jako zmienną – Fals

Odpowiedz

11

HTML

<city-zip city="clientCity" zip="clientZip" required-param="true"></city-zip> 
<city-zip city="clientCity" zip="clientZip" required-param="{{ someBooleanValue }}"></city-zip> 

kątowa

.directive('cityZip', function() { 
    return { 
     restrict: 'E', 
     templateUrl: '../templates/templateCityZip.html', 
     scope: { 
      city: '=', 
      zip: '=', 
      requiredParam:'@' 
     }, 
     link: function(scope) { 
      console.log("requiredParam", scope.requiredParam); 
     } 
    } 
}) 
+1

Przykro mi, to się zwraca niezdefiniowane –

+1

sprawdź teraz, edytuj "required-param = ', was' requiredParam = ' –

+0

Zmieniłem to. Czy możesz to zrobić? spójrz na mój komentarz na temat ng-required? –

7

Wewnątrz link, można uzyskać dostęp do atrybutu:

return { 
    // code 
    link: link 
} 

function link(scope, $el, attrs) { 
    var requiredParam = attrs.requiredParam === 'true'; 
} 

To będzie zmuszać wartość ciągu do Boolean (jeśli wartość ciąg jest „true”, to zwróci wartość true, w przeciwnym razie to będzie return false.)

Najważniejszą częścią jest konwersja ciągu znaków "true" lub "false" do postaci boolowskiej, ponieważ zarówno !!'true', jak i !!'false' zwracają wartość true. Zobacz this answer dla rozwiązania i rozszerzonej dyskusji.

Jeśli chcesz użyć wartości w kontrolerze, możesz zrobić ten sam wzór w obiekcie scope i przekazać go w przymuszonej formie do kontrolera połączonego.

+0

@JBNizet, tak właśnie sobie uświadomiłem, zmieniłem odpowiedź tuż przed komentarzem (teraz mówi 'var requiredParam == attrs.requiredParam === 'true''. –

+0

Dziękuję za odpowiedź. Moja dyrektywa nie działa, możliwe, ponieważ łącze i kontroler w tym samym czasie? Czy możesz wskazać mi, jak to zrobić w kontrolerze? Nawet nie wiem, dlaczego link jest dla. –

+1

@Zigson, Proponuję czytanie dokumentów AngularJS dla dyrektywy, daje całkiem dobre wytłumaczenie, jak używać linku: –

1

Istnieją 3 parametry, które można przekazać do funkcji, które pracują nad dyrektywą łącza. Parametry są scope, element i .

  1. scope podaje zakres kontrolera, któremu podlega dyrektywa.

  2. element przekazuje informację o elemencie DOM, w którym jest on stosowany

  3. przekazuje informacje o wszystkich atrybutów DOM, które znajdują się na elemencie atrybutów.

    <city-zip ng-app="myapp" city="clientCity" zip="clientZip" required-param="true"></city-zip> 
    
    angular.module("myapp", []).directive('cityZip', function() { 
    return { 
        restrict: 'E', 
        templateUrl: '', 
        scope: { 
         requiredParam:'@' 
        }, 
        link: function(scope, $el, attrs) { 
         alert(attrs.requiredParam); 
        } 
    } 
    

    })

Praca jsFiddle

+0

Dziękuję za twój wysiłek. Dostaję prawdę lub fałsz, ale jakoś myślę, że to nie jest naprawdę boolean. Używam ng-required = "requiredParam" w moim szablonie dyrektywy: otrzymuję błędy sprawdzania poprawności, chociaż wymagane ng jest ustawione na true. –

+0

To działa, zapomniałem powiązać requiredParam (umieść je w nawiasach klamrowych). –

4

Myślę najprostszą/najczystszych odpowiedź nie została jeszcze zawarte na to pytanie. Ta odpowiedź pasuje również w HTML5 Spec dla atrybutu Boolean - http://www.w3.org/TR/html5/infrastructure.html#boolean-attributes

2.5.2 Boolean atrybuty

Szereg atrybuty boolean atrybuty.Obecność atrybutu boolean na elemencie reprezentuje wartość true, a brak atrybutu reprezentuje wartość false.

Jeśli atrybut jest obecny, jego wartość musi być albo pusta struna lub wartość, która jest ASCII wielkości liter pasuje do nazwy kanonicznej atrybutu , bez prowadzącego lub końcowe białe znaki.

Wartości "true" i "false" nie są dozwolone dla atrybutów boolean. Aby reprezentować fałszywą wartość, należy całkowicie pominąć atrybut .

HTML:

<city-zip city="clientCity" zip="clientZip" requiredParam></city-zip> 

I dyrektywy:

.directive('cityZip', function() { 
    return { 
     restrict: 'E', 
     templateUrl: '../templates/templateCityZip.html', 
     scope: { 
      city: '=', 
      zip: '=' 
     }, 
     controller: function($scope, $attrs) { 
      $scope.requiredParamExists = $attrs.hasOwnProperty('requiredParam'); 
     } 
    } 
}); 

Prosty, pasuje czysto z HTML5 spec logicznych atrybuty i bez konieczności zmuszenia ciąg do zmiennej Zakres ('requiredParam': '=').

Uwaga w powyższym przykładowym kodzie, jeśli zostanie minified, wymagane zmienne $scope i $attrs zostaną zmienione na krótszy ciąg znaków i złamany kod, ale jest to kolejny problem.

+0

Duży problem z tą implementacją polega na tym, że chcesz użyć komponentu z tym typem szablonu atrybutu wewnątrz własnego komponentu, a jednocześnie dynamicznie dołączyć ten atrybut. Na przykład, jeśli chcesz wyłączyć dynamicznie atrybut "wiele" ui-select lub nie powtarzać elementu HTML i używać polecenia ng-if. Na podstawie tego samodzielnie osobiście polecam, aby nigdy nie używać wzorca w tej odpowiedzi. – sean2078

+0

@ sean2078 Nie śledzę, ponieważ minęło trochę czasu odkąd pracowałem nad tym problemem. Czy możesz podać przykład problemu i/lub tego, co znalazłeś, aby działać lepiej, dla potomności? – ryanm

Powiązane problemy