2012-12-18 30 views
55

Bir şekilde, Açısal'nın büyüsüyle, ng-model kullanırsanız ve bunu bir boole sağlarsanız, söz konusu boolean doğruysa onay kutusu işaretlenir ve yanlışsa işaretlenmemiş olur.AngularJS: Ters Checkbox Durum

<input type="checkbox" ng-model="video.hidden"> 

yalnız bu oldukça şaşırtıcı olsa da, aslında, çünkü todo.done işaretli alır kutusu anlamına todo örneğin tersine, kontrol durumunu tersine çevirmek için çalışıyorum, benim modeli daha todo.incomplete gibidir.

Ne yazık ki benim ilk tahminim işe yaramadı:

<input type="checkbox" ng-model="!video.hidden"> 

manken bana dikte edilmiş bir konumda değilim, bu yüzden onu değiştiremez ve zorunda kalmak istemiyoruz İstemciye masaj yapın (çünkü istemci nesnelerini sunucuya geri gönderiyorum çünkü güvenilir bir ortamda çalışıyor).

Güncelleme

Bu 1.3 çalışır ve size dizeleri (1.2.xxx yerine boole ipleri verdi) vermez: Bir yolu var sanmıyorum

<input type="checkbox" ng-model="video.hidden" ng-true-value="false" ng-false-value="true"> 
+0

ya da sadece size modeli tanımlamak için kullanılan her türlü kelimenin bir olumsuzlamasıydı kullanın: video.shown:? veya kontrol kutucuğunda bir başka modelin değerini ayarlamak için kontrol cihazınızdaki bir fonksiyonu kullanın. Bu benim görüşüme göre gerçek bir sorun değildir. – mpm

+0

@camus Söylediğim son şey, modeli değiştirmek istemediğim ve yapmam gerekmemesi gerektiğiydi. Tabii ki bu gerçek bir problem değil, ama bir çerçeve kullanım kolaylığını tolere ettiğinde, ilk tahminimin neden çalışmadığı konusunda bir sebep yok. Bir işlevi kullanarak – Langdon

+1

modeli değiştirmiyor, ancak bir denetleyiciye bir işlev eklemiyor. Ve hiçbir çerçeve bir gümüş mermi değildir. Ama bu kolayca uzatılabilir, zaten yapmak zorunda olduğunuz, direktifleri yazmanız gereken şey bu. – mpm

cevap

69

Sen yapabileceği artık özel yönetmeliğinin ihtiyacı, açısal destek ng-true-value ve ng-false-value olmadan

https://docs.angularjs.org/api/ng/input/input[checkbox]

senin örneğin şimdi çalışmalı

<input type="checkbox" ng-model="video.hidden" ng-true-value="false" ng-false-value="true">

Bu onay kutusu başlangıç ​​değerini sağlar

<input type="checkbox" ng-init="video = false" ng-model="video" > 

:

+1

Bu çözümle ilgili sorun, onay kutusunun görüntülendiğinde video.hidden değerini göstermeye devam etmesidir. –

+0

1,3 olarak düzelttiği görülüyor. – Langdon

+0

"ng-true-value" ve "ng-false-value" işlevlerini görüyorum, ancak 'false' değeri sunucuya gönderilmiyor. Belki de başarılı bir form kontrolü değildir. –

23

Bunu sadece şablonda yapın. Bunu gerçekleştirmenin en belirgin yolu, model değerinize manuel olarak çift bağlanan yeni bir kapsam değişkeni oluşturmaktır.

<input type="checkbox" ng-model="videoShowing"> 

Ve denetleyicisi: Yani böyle

$scope.videoShowing = !$scope.video.hidden; 

$scope.$watch('video.hidden', function(value) { 
    $scope.videoShowing = !value; 
}); 
$scope.$watch('videoShowing', function(value) { 
    $scope.video.hidden = !value; 
} 

Neredeyse sadece ng-değişimle bağlayıcı tek yönlü kullanabilirsiniz, ama bu oldukça çalışır değil:

<input type="checkbox" ng-checked="!video.hidden" ng-change="???"> 

ng-change geçerli değeri yerel kapsamda hiç karıştırmaz. Eğer NgModelController'a erişebildiğin bir bağlamda olsaydın, bir şeyler yapabilirdin, ama bunun için özel bir direktife ihtiyacın olurdu. NgModel'in formatlarını ve ayrıştırıcılarını değiştiren bir "ters" öznitelik yönergesi yapmak zor olmaz. Çok sayıda ters çevrilmiş onay kutularına ihtiyacınız varsa öneririm. bir "ters" özelliğini yapma kuşaklar için

Düzenleme

, süper basit, hem de sadece o yapabilir. Direktiflerin yapılması her zaman ilk başta bir acı gibi gözükür, ama bu gerçekten Açısal yoldur.

someModule.directive('inverted', function() { 
    return { 
    require: 'ngModel', 
    link: function(scope, element, attrs, ngModel) { 
     ngModel.$parsers.push(function(val) { return !val; }); 
     ngModel.$formatters.push(function(val) { return !val; }); 
    } 
    }; 
}); 

emin olmak için, yerine itme "unshift" çok öncelik ayarlamak gerekir ya Olabilir sonra çalıştırmak bu adamlar yerleşik inputDirective olanlar.

+0

Burada ngModel argümanı nedir? Bu konuda herhangi bir belge var mı? ya da bir çeşit DI büyüsü mü? –

+1

"Bağlantının" dördüncü bağımsız değişkeni, ne gerektiriyorsa onu yansıtır. – jpsimons

13

Bu

<input type="checkbox" 
     ng-init = "video.checked = !video.hidden" 
     ng-model ="video.checked" 
     ng-change ="video.hidden = !video.checked"/> 

Bu onay kutusu değerleri güncellenir değiştirir en kısa sürede video.hidden tersi bir video.checked özelliği tanıtır çalışıyor gibi görünüyor.Burada

Örnek: http://plnkr.co/edit/7HYht6ubkUUJQ0r3g16m?p=preview

+0

Güzel, bu işe yarıyor. 'Ng-init' kısmı gerekli olsa da mı? 'Ng-change' içinde, 'input' erişimi olmayan kontrol durumunu okuyor musunuz? Görüntü toplandığında – Langdon

+0

'ng-init' kullanılmadan 'video.checked' değeri 'undefined' olur ve video.hidden' false olarak ayarlanmış olsa bile onay kutuları işaretlenmemiş olur; . Eğer 'ng-init' seçeneğini kaldırırsanız, 'videos' nesnelerini denetleyiciden değiştirmeniz ve oradan başlatmayı yapmanız gerekir. – jaime

+1

Yani ng değişiminin içindeki 'input' hedefine erişiminiz yok mu? Gibi, ben diyemedim: 'ng-change =" video.hidden =! $ Element.checked "' – Langdon

4

Çözümümün sadece "giriş" eklediğiniz bir yönerge "olumsuzlamak" kullanır. Bu basit ve denetleyiciyi değiştirmeye gerek yok.

angular 
    .module("<< your module >>") 
    .directive('negate', [ 
     function() { 
      return { 
       require: 'ngModel', 
       link: function (scope, element, attribute, ngModelController) { 
        ngModelController.$isEmpty = function(value) { 
         return !!value; 
        }; 

        ngModelController.$formatters.unshift(function (value) { 
         return !value; 
        }); 

        ngModelController.$parsers.unshift(function (value) { 
         return !value; 
        }); 
       } 
      }; 
     } 
    ] 
); 

böyle kullanın:

<input type="checkbox" negate ng-model="entity.nologin"> 
0

en basit çözüm, onay kutusu için kontrol ya da kontrol değeri aşağıdaki gibi kutusunun giriş elemanı içinde ng-init yönergesi eklenerek elde etmenin düşünmek yanlış ol, devlet kontrol edilmedi. Formu gönderirken, onay kutusu işaretli değilse, döndüren (veya konsol) değeri yanlıştır, yerine "undefined", aksi takdirde bu doğru olur. Eğer doğru veya yanlış devlet için özel yapılmış değerler eklemek isterseniz

, şunları kullanabilirsiniz:

ng-true-value="'custom_true value'" 

ve

ng-false-value="'custom_false value'" 

giriş öğesinin içine. gibi:

<input type="checkbox" ng-init="video = false" ng-model="video" ng-true-value="'custom_true value'" ng-false-value="'custom_false value'"> 
0

My Çözüm Çok basit: Sadece ng-gerçek değer/ng-yanlış-değeri ve ng-gerçek değer yanlış ve gerçek set ng-yanlış-değeri kullanın işlevselliği tersine çevirir.

<input type="checkbox" ng-model="<<-- Your Model -->> " ng-true-value="false" 
 
      ng-false-value="true">