Angularjs ng-model ng-if içinde çalışmaz


206

İşte sorunu gösteren keman. http://jsfiddle.net/Erk4V/1/

Bir ng-if içinde bir ng-modelim varsa, model beklendiği gibi çalışmıyor.

Bunun bir hata olup olmadığını veya doğru kullanımı yanlış anlayıp anlamadığımı merak ediyorum.

<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>

6
Geçici bir çözüm için ng-if yerine ng-show = "CONDITION" kullanabilirsiniz. İşe yaramalı.
Hari Das

Sanırım artık bu artık bir sorun değil controllerAsmi?
jamiebarrow

Örtülü bir yönerge kullanırken aynı sorunu scope:falseyaşadım ng-ifve yönerge etrafına eleman ekledim - başlangıçta kapsamlar bağlandı, ancak bir gözlemci kapsam değerlerinden birini güncelledikten sonra ayrıldı ...
Nisan

Yanıtlar:


223

ng-ifDiğer yönergeler gibi yönerge, bir çocuk kapsamını oluşturur. Aşağıdaki komut dosyasına bakın (veya bu jsfiddle )

<script src="https://ajax.googleapis.com/ajax/libs/angularjs/1.2.0rc1/angular.min.js"></script>

<script>
    function main($scope) {
        $scope.testa = false;
        $scope.testb = false;
        $scope.testc = false;
        $scope.obj = {test: false};
    }
</script>

<div ng-app >
    <div ng-controller="main">
        
        Test A: {{testa}}<br />
        Test B: {{testb}}<br />
        Test C: {{testc}}<br />
        {{obj.test}}
        
        <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" /> {{testb}}
        </div>
        <div ng-if="!someothervar">
            testc (with ng-if): <input type="checkbox" ng-model="testc" />
        </div>
        <div ng-if="!someothervar">
            object (with ng-if): <input type="checkbox" ng-model="obj.test" />
        </div>
        
    </div>
</div>

Bu nedenle, onay kutunuz testbalt kapsamın içini değiştirir , ancak dış ana kapsamı değiştirmez.

Üst kapsamdaki verileri değiştirmek isterseniz, eklediğim son div öğesinde olduğu gibi bir nesnenin dahili özelliklerini değiştirmeniz gerektiğini unutmayın.


1
Ng-if'in kapsamına ana kontrolörler işlevinden nasıl erişebilirim? Biraz sinir bozucu. Bunun sebebi ne?
Justin Carlson

Nevermind, @sza bu ^ soruyu yeni yanıtladı. Bu yanıtı doğru olarak işaretleyeceğim, çünkü sorun yaşadığımın kesin nedenini açıklıyor.
Justin Carlson

21
Bu, örnekte belirtildiği gibi, kapsam özelliklerini doğrudan değiştirmek yerine kapsamınızda bir nesne kullanmanın oldukça yaygın olmasının bir nedenidir: $scope.obj = {...}ve ng-model="obj.someProperty"bu sınırlamanın üstesinden gelir.
wulftone

204

$parentÜst kapsamda bu şekilde tanımlanan modele başvurmak için kullanabilirsiniz

<input type="checkbox" ng-model="$parent.testb" />

16
o zaman ben ng-model="$parent.$parent.foozaten bir kapsam içinde olduğum için var ng-repeat- bu gerçekten en iyi yol mu?
chovy

4
bu gerçekten kafa karıştırıcı. Neden? ve neden ng-hide'ın kendi kapsamı yok?
Dominik Goltermann

5
Re @Gaul: muhtemelen ng-hide / ng-show mevcut DOM üzerinde çalışıyor ve sadece bir CSS sınıfı ekliyor / kaldırıyor, ng-if / ng-switch / ng-DOM ile tüm muck'leri tekrarlıyor ve ekstra durumu takip ediyor . Mantıklı görünüyor.
trisweb

4
Mantıklı kullandığım kelime değil .
Jonathan Dumaine

3
Özgün kapsama bir nesne ekleyin ve o nesnenin özelliklerini değiştirin. örneğin ng-model = "myObject.property". Bu, tüm kapsam / $ ebeveyn inancını azaltacaktır. Daha fazla bilgi için Google "açısal nokta kuralı".
Şubat'ta Asmor

50

Sen kullanabilirsiniz ngHide (veya ngShow) yönergesini. NgIf gibi alt kapsam oluşturmaz.

<div ng-hide="testa">

3
ngIfO zaman neden bir alt kapsam oluşturur? Bana çok garip geliyor.
freeall

5
Zsong cevabının yorumlarına dikkat edin. ng-hidehtml yapısını değiştirmez. Sadece css stillerini değiştirir. ng-ifdaha karmaşıktır: duruma bağlı olarak html parçalarını kaldırır ve ekler. Durumu depolamak için alt kapsam oluşturur (en azından gizli html kısmını saklamalıdır).
Vasiliy Kevroletin

Evet, benim için çalış
Basit

7

Diğer birçok durumda bunu yaşadık, dahili olarak karar verdiğimiz şey, denetleyici / direktif için her zaman bir sargıya sahip olmaktır, böylece düşünmemize gerek kalmaz. İşte bizim sarıcı ile örnek.

<script src="https://ajax.googleapis.com/ajax/libs/angularjs/1.2.0rc1/angular.min.js"></script>

<script>
    function main($scope) {
        $scope.thisScope = $scope;
        $scope.testa = false;
        $scope.testb = false;
        $scope.testc = false;
        $scope.testd = false;
    }
</script>

<div ng-app >
    <div ng-controller="main">

        Test A: {{testa}}<br />
        Test B: {{testb}}<br />
        Test C: {{testc}}<br />
        Test D: {{testd}}<br />

        <div>
            testa (without ng-if): <input type="checkbox" ng-model="thisScope.testa" />
        </div>
        <div ng-if="!testa">
            testb (with ng-if): <input type="checkbox" ng-model="thisScope.testb" />
        </div>
        <div ng-show="!testa">
            testc (with ng-show): <input type="checkbox" ng-model="thisScope.testc" />
        </div>
        <div ng-hide="testa">
            testd (with ng-hide): <input type="checkbox" ng-model="thisScope.testd" />
        </div>

    </div>
</div>

Umarım bu yardımcı olur, Yishay


3

Evet, ng-hide (veya ng-show) yönergesi alt kapsam oluşturmaz.

İşte benim uygulama:

<script src="https://ajax.googleapis.com/ajax/libs/angularjs/1.2.0rc1/angular.min.js"></script>

<script>
    function main($scope) {
        $scope.testa = false;
        $scope.testb = false;
        $scope.testc = false;
        $scope.testd = false;
    }
</script>

<div ng-app >
    <div ng-controller="main">

        Test A: {{testa}}<br />
        Test B: {{testb}}<br />
        Test C: {{testc}}<br />
        Test D: {{testd}}<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="$parent.testb" />
        </div>
        <div ng-show="!testa">
            testc (with ng-show): <input type="checkbox" ng-model="testc" />
        </div>
        <div ng-hide="testa">
            testd (with ng-hide): <input type="checkbox" ng-model="testd" />
        </div>

    </div>
</div>

http://jsfiddle.net/bn64Lrzu/


0

Bunu böyle yapabilirsiniz ve mod fonksiyonu mükemmel çalışacak bir kod kalemi istiyorsanız bana bildirin

  <div ng-repeat="icon in icons">                   
                <div class="row" ng-if="$index % 3 == 0 ">
                    <i class="col col-33 {{icons[$index + n].icon}} custom-icon"></i>
                    <i class="col col-33 {{icons[$index + n + 1].icon}} custom-icon"></i>
                    <i class="col col-33 {{icons[$index + n + 2].icon}} custom-icon"></i>
                </div>
         </div>
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.