AngularJS'de şartlı olarak nitelikleri uygulamanın en iyi yolu nedir?


296

Ben kapsamda bir boole değişkene dayalı, örneğin elemanlara "contenteditable" eklemek mümkün olması gerekir.

Örnek kullanım:

<h1 attrs="{'contenteditable=\"true\"': editMode}">{{content.title}}</h1>

İçerik $scope.editModeayarlanmışsa öğeye contenteditable = true öğesinin eklenmesiyle sonuçlanır true. Bu ng sınıfı benzeri nitelik davranışını uygulamanın kolay bir yolu var mı? Bir yönerge yazmayı ve paylaşmamayı düşünüyorum.

Düzenleme: Benim önerilen attrs yönergesi ve ng-bind-attrs arasında bazı benzerlikler olduğunu görüyorum, ama 1.0.0.rc3 kaldırıldı , neden öyleyse?


2
Ben böyle bir şeyle karşılaşmadım. Oy kullanıyorum! : D Belki açısal projeye sunun. Ng sınıfıyla daha iyi eşleşen bir sözdizimi iyi olurdu. ng-attr="expression".
Xesued

Kesinlikle evet olduğunu düşünüyorum!
Kenneth Lynne

3
Bu gerçekten ngClass veya ngStyle ile aynı değildir, çünkü tek bir niteliği kontrol ederler ve herhangi bir niteliği kontrol etmek istersiniz . Bence bir contentEditabledirektif oluşturmak daha iyi olur .
Josh David Miller

@JoshDavidMiller +1 bu konuda. Özellikle karmaşıklığı göz önünde bulundurarak, herhangi bir özelliği kontrol edebilmenin çok az yararı olduğunu düşünüyorum. Bir değişken üzerinde koşullu olarak hareket eden direktifleriniz olabilir.
Umur Kontacı

<h1 ng-attr-contenteditable="{{editMode && true : false}}">{{content.title}}</h1>
mia

Yanıtlar:


272

Ng sınıfı kullanılamaz (örneğin SVG stil) zaman koşullu olarak sınıf attr ayarlamak için aşağıdaki kullanıyorum:

ng-attr-class="{{someBoolean && 'class-when-true' || 'class-when-false' }}"

Aynı yaklaşım, diğer özellik türleri için de geçerli olmalıdır.

(Ng-attr- kullanmak için en son dengesiz açısal olmanız gerektiğini düşünüyorum, şu anda 1.1.4'deyim)


97
Sadece bu cevabı açıklığa kavuşturmak için: Herhangi bir özniteliğe ng-attr-önek eklerseniz, derleyici öneki sıyırır ve özniteliği orijinal öznitelik değerinden açısal ifadenin sonucuna bağlı değeriyle ekler .
Matthias

12
Bence, 1.1.5'te destek eklenmiş bir üçlü operatör kullanıyorsanız okumak daha kolaydır. Bu şöyle görünecektir: {{someConditionalExpression? 'class-when-true': 'class-when-false'}}
dshap

129
bu yaklaşımdaki sorun, sonuçtan bağımsız olarak niteliğin yaratılmasıdır. İdeal olarak, özelliğin yaratılıp yaratılmadığını kontrol etmek istiyoruz.
airtonix

24
Müdahalelerin Açısal 1.2'den kaldırıldığına dikkat edin. Bu cevap artık geçerli değil.
Judah Gabriel Himango

2
Hatalısınız. Bu proje github.com/codecapers/AngularJS-FlowChart Açısal 1.2 ve ng-attr- kullanır. Ayrıca en son dokümanlar (Açısal 1.4) hala ng-attr- içerir
Ashley Davis

120

ng-attrBir Açısal ifadeyi değerlendirmek için niteliklerin önüne önek ekleyebilirsiniz . İfadelerin sonucu tanımsız olduğunda, bu değer öznitelikten kaldırılır.

<a ng-attr-href="{{value || undefined}}">Hello World</a>

Üretecek (değer yanlış olduğunda)

<a ng-attr-href="{{value || undefined}}" href>Hello World</a>

Bu yüzden kullanmayın falseçünkü bu değer olarak "false" kelimesini üretecektir.

<a ng-attr-href="{{value || false}}" href="false">Hello World</a>

Bu hileyi bir direktifte kullanırken. Bir değerin eksik olması durumunda yönerge nitelikleri yanlış olur.

Örneğin, yukarıdakiler yanlış olur.

function post($scope, $el, $attr) {
      var url = $attr['href'] || false;
      alert(url === false);
}

3
Bu cevabı beğendim. Ancak, değer tanımsızsa özniteliği gizleyeceğini düşünmüyorum. Yine de bir şeyleri kaçırıyor olabilirim. Dolayısıyla ilk sonuç <a ng-attr-href="{{value || undefined {{" href> Merhaba Dünya </a>
Roman K

13
@RomanK merhaba, el kitabı undefinedözel bir durum olduğunu belirtiyor . "NgAttr kullanılırken, $ interpolate'in allOrNothing bayrağı kullanılır, bu nedenle enterpolasyonlu dizgideki herhangi bir ifade tanımsızsa, öznitelik kaldırılır ve öğeye eklenmez."
Reactgular

9
Gelecekteki okuyuculara yardımcı olacak bir not, 'tanımsız' davranışın Açısal 1.3'e eklenmiş olduğu görülüyor. 1.2.27 kullanıyorum ve şu anda IE8 gerekir.
Adam Marshall

3
Biraz daha doğrulamak için değer tanımsız olsa bile Açısal 1.2.15 href görüntüler, tanımlanmamış davranış yukarıdaki yorum durumlarında Angular 1.3'te başlar gibi görünür.
Brian Ogden

Bu notu önemlidir ng-attr-fooolacak hala hep çağırmak foovarsa yönerge, hatta ng-attr-foosonucunu undefined. Tartışma
Hughes

97

Bu özelliği zor ayarlayarak aldım. Ve öznitelik için boole değerini kullanarak özniteliğin uygulanabilirliğini denetleme.

Kod pasajı şöyledir:

<div contenteditable="{{ condition ? 'true' : 'false'}}"></div>

Umarım bu yardımcı olur.


Açısal olarak IIF ifadesini ayrıştırabildiğinden, mevcut kapsamdaki durumu değerlendirmek ve bu duruma dayalı değerleri belirlemek için mükemmel çalışır.
mccainz

22

Angular'ın (1.1.5) en son sürümünde, adlı bir koşullu yönerge eklediler ngIf. Öğelerden farklıdır ngShowve ngHideiçinde öğeler gizlenmez, ancak DOM'a hiç dahil edilmez. Oluşturulması pahalı olan ancak kullanılmayan bileşenler için çok kullanışlıdır:

<h1 ng-if="editMode" contenteditable=true>{{content.title}}</h1>

32
Ben sadece ng-eğer bir eleman düzeyinde çalışıyor, yani, bir elemanın sadece bir özniteliği için bir koşul belirtemezsiniz.
Max Strater

3
Gerçekten, ama sonra yapabilirsiniz<h1 ng-if="editMode" contenteditable="true"><h1 ng-if="!editMode">
ByScripts

5
ancak bu ng-ifyeni bir kapsam oluşturur dikkat edin .
Shimon Rachlenko

1
@ShimonRachlenko Kabul etti! Bu büyük bir karışıklık ve hata kaynağı olabilir. ng-ifyeni bir kapsam oluşturur ng-show, ancak oluşturmaz. Bu tutarsızlık benim için her zaman acıyan bir nokta olmuştur. Buna karşı savunmacı programlama tepkisi şöyledir: "her zaman ifadedeki noktanın bir şeye bağlanması" ve bu bir sorun olmayacaktır.
Brian Genisio

Aslında bir yönerge olan bir özellik eklemek istiyorsanız, bu harika çalışıyor. Kod tekrarı hakkında utanç
Adam Marshall

16

Bir Boole çekine dayalı olarak belirli bir değeri göstermek için bir öznitelik almak veya boolean denetimi başarısız olursa, tamamen atlanmak için aşağıdakileri kullandım:

ng-attr-example="{{params.type == 'test' ? 'itWasTest' : undefined }}"

Örnek kullanım:

<div ng-attr-class="{{params.type == 'test' ? 'itWasTest' : undefined }}">

Çıktı <div class="itWasTest">veya <div>değeri dayalıparams.type


9

<h1 ng-attr-contenteditable="{{isTrue || undefined }}">{{content.title}}</h1>

isTrue = true olduğunda üretilir: <h1 contenteditable="true">{{content.title}}</h1>

ve isTrue = false olduğunda: <h1>{{content.title}}</h1>


5
<h1 contenteditable = "row"> gibi bir şey istiyorsam
SuperUberDuper

<h1 ng-attr-contenteditable="{{isTrue ? 'row' : undefined}}">{{content.title}} </h1>
PhatBuck

Kabul edilen cevap bu olmalıyım. Benim bir senaryo olduğunu<video ng-attr-autoplay="{{vm.autoplay || undefined}}" />
LucasM

6

Kabul edilen çözümle ilgili olarak, Ashley Davis tarafından yayınlanan yöntem, tarif edilen yöntem, atanmış değerin tanımlanmamış olmasına bakılmaksızın, DOM'daki niteliği hala yazdırır.

Örneğin, hem bir ng modeli hem de bir değer özniteliğine sahip bir giriş alanı kurulumunda:

<input type="text" name="myInput" data-ng-attr-value="{{myValue}}" data-ng-model="myModel" />

MyValue'nun arkasında ne olursa olsun, değer özelliği DOM'da hala yazdırılır, dolayısıyla yorumlanır. Ng-model daha sonra geçersiz kılınır.

Biraz tatsız, ama ng-if kullanmak hile yapar:

<input type="text" name="myInput" data-ng-if="value" data-ng-attr-value="{{myValue}}" data-ng-model="myModel" />
<input type="text" name="myInput" data-ng-if="!value" data-ng-model="myModel" />

Ben ng-if direktifleri içinde daha ayrıntılı bir kontrol kullanmanızı tavsiye ederim :)


Bu yaklaşımla, aynı kodu tekrar edeceksiniz.
Kalyan

Doğru, ancak model beyanını güvende tutar. Kabul edilen çözümü kullanmayla ilgili sorunum, DOM'da değer özelliğinin sona erdirilmesi ve model bildirimine göre öncelikli olmasıydı. Bu nedenle, değer özelliği boş, ancak model boş değilse, model boş bir değer almak için geçersiz kılınır.
alexc

6

Ayrıca şöyle bir ifade kullanabilirsiniz:

<h1 ng-attr-contenteditable="{{ editMode ? true : false }}"></h1>

5

Aslında birkaç ay önce bunu yapmak için bir yama yazdım (birisi freenode üzerindeki #angularjs'de sorduktan sonra).

Muhtemelen birleştirilmeyecek, ancak ngClass ile çok benzer: https://github.com/angular/angular.js/pull/4269

Birleştirilmiş olsun ya da olmasın, varolan ng-attr- * şeyler muhtemelen ihtiyaçlarınız için uygundur (diğerlerinin de belirttiği gibi), ancak önerdiğiniz daha ngClass tarzı işlevsellikten biraz daha karmaşık olabilir.


2

Giriş alanı doğrulaması için şunları yapabilirsiniz:

<input ng-model="discount" type="number" ng-attr-max="{{discountType == '%' ? 100 : undefined}}">

Bu özellik geçerli olacaktır maxiçin 100yalnızca discountTypeolarak tanımlanır%


1

Edit : Bu cevap Angular2 +! Üzgünüm, etiketi kaçırdım!

Orijinal cevap:

Bir özelliği yalnızca belirli bir Giriş değeri ayarlanmışsa uygulamak (veya ayarlamak) için çok basit bir duruma gelince, bu kadar kolay

<my-element [conditionalAttr]="optionalValue || false">

Aynı:

<my-element [conditionalAttr]="optionalValue ? optionalValue : false">

(Bu nedenle, isteğe bağlı olarak verilirse, isteğe bağlıDeğer uygulanır, ifade yanlıştır ve öznitelik uygulanmaz.)

Örnek: Renk özniteliğinin önceden ayarlandığı gibi çalışmadığı (ancak @Input () rengi verilmemiş olsa bile) bir rengi değil, rastgele stilleri de uygulayabildiğim durumum vardı:

@Component({
  selector: "rb-icon",
  styleUrls: ["icon.component.scss"],
  template: "<span class="ic-{{icon}}" [style.color]="color==color" [ngStyle]="styleObj" ></span>",
})
export class IconComponent {
   @Input() icon: string;
   @Input() color: string;
   @Input() styles: string;

   private styleObj: object;
...
}

Dolayısıyla, "style.color" yalnızca renk özniteliği varken ayarlanmış, aksi takdirde "styles" dizesindeki renk özniteliği kullanılabilir.

Tabii ki, bu da elde edilebilir

[style.color]="color" 

ve

@Input color: (string | boolean) = false;

Açısal.JS, Açısal 2+'den çok farklı olan Açısal 1'dir. Angular 2+ için çözüm cevaplarınız, ancak AngularJS (1) istendi.
ssc-hrep3 07

@ ssc-hrep3: Haklısın. Üzgünüm kaçırdım! Teşekkürler. Bunu belirtmek için cevabı düzenledim. :-)
Zaphoid

angularjs değil açısal değil, angularjs olduğunu açısal 1
dgzornoza

0

Angular 2 için çözüme ihtiyacınız varsa, basit, aşağıdaki gibi özellik bağlama kullanın, örneğin girdiyi yalnızca koşullu olarak okumak istiyorsanız, ardından kare parantezlere attrbute ve ardından = sign ve expression ekleyin.

<input [readonly]="mode=='VIEW'"> 

angularjs (angular1) değil açısal (angular2) değil
dgzornoza

açısal 2+ ve Açısal JS aynı değildir, daha çok farklı ürünler gibidirler.
Sanjay Singh

0

Bu çalışmayı başardı:

ng-attr-aria-current="{{::item.isSelected==true ? 'page' : undefined}}"

Buradaki güzel şey, item.isSelected yanlışsa, özniteliğin işlenmemesidir.

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.