AngularJS - Radyo düğmelerini boole değerleri olan modellere bağlama


199

Özellikleri boolean değerleri olan bir nesneye radyo düğmeleri bağlama bir sorun yaşıyorum. Bir $ kaynağından alınan sınav soruları görüntülemeye çalışıyorum.

HTML:

<label data-ng-repeat="choice in question.choices">
  <input type="radio" name="response" data-ng-model="choice.isUserAnswer" value="true" />
  {{choice.text}}
</label>

JS:

$scope.question = {
    questionText: "This is a test question.",
    choices: [{
            id: 1,
            text: "Choice 1",
            isUserAnswer: false
        }, {
            id: 2,
            text: "Choice 2",
            isUserAnswer: true
        }, {
            id: 3,
            text: "Choice 3",
            isUserAnswer: false
        }]
};   

Bu örnek nesnede, "isUserAnswer: true" özelliği radyo düğmesinin seçilmesine neden olmaz. Boole değerlerini tırnak işaretleri içine alırsam çalışır.

JS:

$scope.question = {
    questionText: "This is a test question.",
    choices: [{
            id: 1,
            text: "Choice 1",
            isUserAnswer: "false"
        }, {
            id: 2,
            text: "Choice 2",
            isUserAnswer: "true"
        }, {
            id: 3,
            text: "Choice 3",
            isUserAnswer: "false"
        }]
};   

Ne yazık ki benim REST hizmetim bu özelliği bir boole olarak davranır ve bu değerleri tırnak içinde kapsüllemek için JSON serileştirme değiştirmek zor olacaktır. Model bağlantımı modelimin yapısını değiştirmeden kurmanın başka bir yolu var mı?

İşte çalışmayan ve çalışmayan nesneleri gösteren jsFiddle

Yanıtlar:


376

Angularjs'de doğru yaklaşım ng-value, modellerin dizgi dışı değerleri için kullanmaktır .

Kodunuzu şu şekilde değiştirin:

<label data-ng-repeat="choice in question.choices">
  <input type="radio" name="response" data-ng-model="choice.isUserAnswer" data-ng-value="true" />
  {{choice.text}}
</label>

Ref: Atın ağzından düz


12
sadece önemli bir yan not eklemek istedim: ng-değerinin kıvırcık parantez olmadan değere sahip olması gerekir {{}} Örnek: ng-value = "choice2.id" vs value = "{{choice2.id}}"
Andi

Evet, bu doğru, ng-değeri bu kapsamda değerlendirildiğinden
kumarharsh

@Andi bu not için teşekkürler, hata ayıklama için biraz zaman kazandım!
Roy Milder

3
Bence veri öneki demek istedim ... Veri öneki HTML'yi geçerli kılmaktır (bu olmadan da tüm modern tarayıcılar HTML'yi doğru şekilde kullanır)
kumarharsh

6
Gönderinin oldukça eski olduğunu biliyorum ama şimdi aynı problemi aldım. Ancak çözümünüzü kullandığımda ve radyo düğmelerini değiştirdiğimde, bir zamanlar seçilmiş olan her şey doğrudur ve yanlış değerine geri dönmezler. Bunun için bir çözüm var mı? (sorun OP'nin Fiddle'da da var)
Dominik G

21

Bu tuhaf bir yaklaşım isUserAnswer. Gerçekten her üç seçeneği de kontrol için her biri döngü olacak sunucuya geri gönderecek misiniz isUserAnswer == true? Öyleyse, bunu deneyebilirsiniz:

http://jsfiddle.net/hgxjv/4/

HTML:

<input type="radio" name="response" value="true" ng-click="setChoiceForQuestion(question1, choice)"/>

JavaScript:

$scope.setChoiceForQuestion = function (q, c) {
    angular.forEach(q.choices, function (c) {
        c.isUserAnswer = false;
    });

    c.isUserAnswer = true;
};

Alternatif olarak, yapışkanlığınızı değiştirmenizi tavsiye ederim:

http://jsfiddle.net/hgxjv/5/

<input type="radio" name="response" value="{{choice.id}}" ng-model="question1.userChoiceId"/>

Bu şekilde {{question1.userChoiceId}}sunucuya geri gönderebilirsiniz .


Yanıtınız için teşekkürler. İkinci çözümünüzün ideal olduğunu biliyorum; Ancak, uygulama aslında "her şeyi kontrol et" de dahil olmak üzere birden fazla soru türünü destekler - bu nedenle her seçimde saklanan değerin nedeni. Söyleyebileceğim kadarıyla, ilk çözümünüz bir seçim yapıldıktan sonra modeli güncellemek için çalışır, ancak sunucudan alınan modeli önceden yapılmış bir seçimle görüntülemek için değil.
peteallen

2
Ah, doğru. Bunu kullanarak çözebilirsiniz ngChecked, ancak true / false dizeleri olarak kullanmaktan kurtulmanız gerekir. Bunu yapabilir misin? jsfiddle.net/hgxjv/6
Langdon

3
Evet, işe yarıyor! Daha önce ngChecked kullanmayı denemiştim, ama ngModel özniteliğini kaldırmamıştım. Bu yapılandırmayla çalışmadı ve bunun ngChecked'in radyo düğmeleriyle uyumlu olmadığını varsaymıştım. NgModel özniteliğini kaldırma ve ngChecked ve bağlama ng'yi kullanma setChoiceForQuestion işlevine tıklayın, yapmaya çalıştığım şeyi başarır. Yardımın için teşekkürler!
peteallen

10
 <label class="rate-hit">
     <input type="radio" ng-model="st.result" ng-value="true" ng-checked="st.result">
     Hit
 </label>
 &nbsp;&nbsp;
 <label class="rate-miss">
     <input type="radio" ng-model="st.result" ng-value="false" ng-checked="!st.result">
     Miss
 </label>

Bence bu sadece işe yarıyor çünkü truedoğru değerlendiriyor. Eğer senin ng-valuebir örnek dize değil, bir şey için bir referans $scopetırnak içine o dizeyi koymak gerekir. Benim için durum buydu.
Jason Swett

Bu benim için en iyi cevap! Teşekkürler Ronel!
Gisway

ng-model tanımlandığı sürece burada ng-check gerekli değildir
Nico Westerdale

7

Ben değiştirmeyi denedim value="true"etmek ng-value="true"ve bu işe görünüyor.

<input type="radio" name="response2" data-ng-model="choice.isUserAnswer" ng-value="true" />

Ayrıca, her iki girdinin de örneğinizde çalışmasını sağlamak için, her girdiye farklı bir ad vermeniz gerekir; örneğin response, response1ve olmalıdır response2.


1
Hayır, isimler aynı olabilir.
kumarharsh


0

Radyolarınızın kemanda nasıl kurulduğunu - aynı modeli paylaştığını - tüm doğru değerleri belirtmeye karar verirseniz, yalnızca son grubun kontrol edilmiş bir radyo göstermesine neden olur. Daha sağlam bir yaklaşım, bireysel gruplara kendi modellerini vermeyi ve değeri, id gibi radyoların benzersiz bir özelliği olarak ayarlamayı içerir:

$scope.radioMod = 1;
$scope.radioMod2 = 2;

İşte yeni html'in bir temsili:

<label data-ng-repeat="choice2 in question2.choices">
            <input type="radio" name="response2" data-ng-model="radioMod2" value="{{choice2.id}}"/>
                {{choice2.text}}
        </label>

Ve bir keman.


0

radyo düğmesini bağlamak için boolean değişkeni kullanıyorsanız. lütfen aşağıdaki örnek koda bakın

<div ng-repeat="book in books"> 
<input type="radio" ng-checked="book.selected"  
ng-click="function($event)">                        
</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.