Oto skrzypce pokazujące problem. http://jsfiddle.net/Erk4V/1/
Wygląda na to, że jeśli mam model ng wewnątrz ng-if, model nie działa zgodnie z oczekiwaniami.
Zastanawiam się, czy to błąd, czy też nie rozumiem właściwego użycia.
<div ng-app >
<div ng-controller="main">
Test A: {{testa}}<br />
Test B: {{testb}}<br />
Test C: {{testc}}<br />
<div>
testa (without ng-if): <input type="checkbox" ng-model="testa" />
</div>
<div ng-if="!testa">
testb (with ng-if): <input type="checkbox" ng-model="testb" />
</div>
<div ng-if="!someothervar">
testc (with ng-if): <input type="checkbox" ng-model="testc" />
</div>
</div>
</div>
controllerAs
?scope:false
i dodałemng-if
element wokół dyrektywy - zakresy były początkowo związane, ale zostały one rozdzielone po tym, jak obserwator zaktualizował jedną z wartości zakresu ...Odpowiedzi:
ng-if
Dyrektywa, podobnie jak inne dyrektywy tworzy zakres dzieci. Zobacz poniższy skrypt (lub ten jsfiddle )Zatem pole wyboru zmienia
testb
wnętrze zakresu potomnego, ale nie zewnętrzny zakres macierzysty.Zauważ, że jeśli chcesz zmodyfikować dane w zakresie nadrzędnym, musisz zmodyfikować wewnętrzne właściwości obiektu, tak jak w ostatnim div, który dodałem.
źródło
$scope.obj = {...}
ing-model="obj.someProperty"
pokonuje to ograniczenie.Możesz użyć,
$parent
aby odwołać się do modelu zdefiniowanego w zakresie nadrzędnym w ten sposóbźródło
ng-model="$parent.$parent.foo
ponieważ już jestem w zasięgu zng-repeat
- czy to naprawdę najlepszy sposób?Możesz użyć dyrektywy ngHide (lub ngShow) . Nie tworzy zasięgu potomnego tak jak ngIf.
źródło
ngIf
zatem tworzy zakres potomny? Wydaje mi się to bardzo dziwne.ng-hide
nie zmienia struktury HTML. Po prostu zmienia style css.ng-if
jest bardziej złożony: usuwa i wstawia części HTML w zależności od stanu. Tworzy zakres potomny do przechowywania stanu (przynajmniej powinien przechowywać ukrytą część HTML).Mieliśmy to w wielu innych przypadkach, dlatego zdecydowaliśmy wewnętrznie, aby zawsze mieć opakowanie na kontroler / dyrektywę, abyśmy nie musieli o tym myśleć. Oto twój przykład z naszą owijarką.
Mam nadzieję, że to pomoże, Yishay
źródło
Tak, dyrektywa ng-hide (lub ng-show) nie utworzy zasięgu potomnego.
Oto moja praktyka:
http://jsfiddle.net/bn64Lrzu/
źródło
Możesz to zrobić w ten sposób, a funkcja mod będzie działać idealnie, daj mi znać, jeśli chcesz pióro kodowe
źródło