Zamień pierwszą literę ciągu na wielką literę w AngularJs


134

Chcę użyć pierwszej litery ciągu w angularjs

Jak użyłem {{ uppercase_expression | uppercase}}, zamień cały ciąg na duże litery.


1
Tak, będziesz musiał napisać jakiś kod. Kanciasty nie zrobi wszystko za Ciebie. developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/… , developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/…
JB Nizet

11
Można to również zrobić za pomocą CSS. Zobacz właściwość text-transform: capitalize
Ramanathan Muthuraman

1
Możesz skorzystać z tego rozwiązania, jeśli naprawdę chcesz używać angular
Yousef_Shamshoum

1
utwórz prostą dyrektywę / filtr, która sprawi, że pierwsza litera słowa będzie dla Ciebie wielka ...
Pankaj Parkar

Odpowiedzi:


234

użyj tego filtra z wielkimi literami

var app = angular.module('app', []);

app.controller('Ctrl', function ($scope) {
   $scope.msg = 'hello, world.';
});

app.filter('capitalize', function() {
    return function(input) {
      return (angular.isString(input) && input.length > 0) ? input.charAt(0).toUpperCase() + input.substr(1).toLowerCase() : input;
    }
});
<script src="https://ajax.googleapis.com/ajax/libs/angularjs/1.2.23/angular.min.js"></script>
<div ng-app="app">
    <div ng-controller="Ctrl">
        <p><b>My Text:</b> {{msg | capitalize}}</p>
    </div>
</div>


11
Jeśli chcesz przypadkowo wpisać wielką literę, pojawia się błąd. Ciało funkcji powinno być tak: return (angular.isString(s) && s.length > 0) ? s[0].toUpperCase() + s.substr(1).toLowerCase() : s;. Jeśli nie jest to łańcuch, zwróć go bez zmian.
Jabba

2
Tutaj jest napisany niestandardowy filtr wielkich
Michał

148

Powiedziałbym, że nie używaj angular / js, ponieważ możesz po prostu użyć css:

W swoim css dodaj klasę:

.capitalize {
   text-transform: capitalize;
}

Następnie po prostu zawiń wyrażenie (na przykład) w swoim html:

<span class="capitalize">{{ uppercase_expression }}</span>

Nie potrzeba js;)


7
Ten przekształcać będzie wykorzystać pierwszą literę każdego słowa tak ma zastosowanie tylko do ciągów jeden wyraz
jakub.g

22
@ jakub.g Jeśli chcesz po prostu zacząć wielkie litery w pierwszym słowie (no cóż, literze), po prostu rozwiń selektor css selektorem :first-letterpseudoelementu. Coś jeszcze zostało odkryte? :)
Philzen

2
@Philzen Yes! Jak byś to zrobił używając samego HTML? ;-)
Romain Vincent

@RomainVincent Co masz na myśli, mówiąc „tylko HTML”? Może moja odpowiedź poniżej pomoże (wystarczy kliknąć „Uruchom fragment kodu”, aby zobaczyć, jak działa). Treść HTML jest statyczna, będziesz musiał przynajmniej dodać trochę CSS lub JS, aby zmodyfikować jej styl lub treść DOM.
Philzen

4
Przepraszam, to była zła próba zażartowania.
Romain Vincent

57

Jeśli używasz Bootstrap , możesz po prostu dodać text-capitalizeklasę pomocniczą:

<p class="text-capitalize">CapiTaliZed text.</p>

EDYCJA: na wypadek, gdyby link znowu zniknął:

Przekształcenie tekstu

Przekształć tekst w komponentach za pomocą klas wielkości liter.

tekst pisany małymi literami.
WIELKIE LITERY.
Tekst CapiTaliZed.

<p class="text-lowercase">Lowercased text.</p>
<p class="text-uppercase">Uppercased text.</p>
<p class="text-capitalize">CapiTaliZed text.</p>

Zwróć uwagę, że wielkie litery w tekście zmieniają tylko pierwszą literę każdego słowa, pozostawiając wielkość liter pozostałych liter bez zmian.


Szybki i łatwy sposób na osiągnięcie celu, również to wielkie litery każdego słowa w ciągu, co jest fajne.
kisanme

za kulisami to właśnie używatext-transform: capitalize;
cameck

27

Jeśli używasz Angular 4+, możesz po prostu użyć titlecase

{{toUppercase | titlecase}}

nie musisz pisać żadnych rur.


4
To jest nieprawidłowa odpowiedź - w pytaniu prosi się o umieszczenie pierwszej litery ciągu na wielką literę, a nie na pierwszej literze każdego słowa.
Alex Peters

23

ładniejszy sposób

app.filter('capitalize', function() {
  return function(token) {
      return token.charAt(0).toUpperCase() + token.slice(1);
   }
});

18

Jeśli zależy Ci na wydajności, staraj się unikać filtrów AngularJS, ponieważ są one stosowane dwa razy na każde wyrażenie, aby sprawdzić ich stabilność.

Lepszym sposobem byłoby użycie ::first-letterpseudoelementu CSS z text-transform: uppercase;. Nie można tego użyć w elementach wbudowanych, takich jak spanjednak, więc następną najlepszą rzeczą byłoby użycie text-transform: capitalize;na całym bloku, w którym każde słowo jest pisane wielką literą.

Przykład:

var app = angular.module('app', []);

app.controller('Ctrl', function ($scope) {
   $scope.msg = 'hello, world.';
});
.capitalize {
  display: inline-block;  
}

.capitalize::first-letter {
  text-transform: uppercase;
}

.capitalize2 {
  text-transform: capitalize;
}
<script src="https://ajax.googleapis.com/ajax/libs/angularjs/1.2.23/angular.min.js"></script>
<div ng-app="app">
    <div ng-controller="Ctrl">
        <b>My text:</b> <div class="capitalize">{{msg}}</div>
        <p><b>My text:</b> <span class="capitalize2">{{msg}}</span></p>
    </div>
</div>


1
Niestety ::first-letternie działa na elementach display: inlineor display: flex, tylko na elementach display:blocklubinline-block
jakub.g

18

Podoba mi się odpowiedź od @TrampGuy

CSS jest zawsze (cóż, nie zawsze) lepszym wyborem, więc: z text-transform: capitalize;pewnością jest do zrobienia.

Ale co, jeśli cała treść jest na początku pisana wielkimi literami? Jeśli wypróbujesz text-transform: capitalize;zawartość typu „FOO BAR”, na ekranie nadal pojawi się „FOO BAR”. Aby obejść ten problem, możesz umieścić text-transform: capitalize;w swoim css, ale także małe litery, więc:

<ul>
  <li class="capitalize">{{ foo.awesome_property | lowercase }}</li>
</ul>

gdzie używamy klasy capitalize @ TrampGuy:

.capitalize {
  text-transform: capitalize;
}

Tak więc, udając, foo.awsome_propertyże normalnie wypisuje „FOO BAR”, wydrukuje teraz żądany „Foo Bar”.


14

jeśli chcesz zapisywać każde słowo z łańcucha wielkimi literami (w toku -> W toku), możesz użyć takiej tablicy.

.filter('capitalize', function() {
    return function(input) {
        return (!!input) ? input.split(' ').map(function(wrd){return wrd.charAt(0).toUpperCase() + wrd.substr(1).toLowerCase();}).join(' ') : '';
    }
});


9

W przypadku Angular 2 i nowszych możesz użyć {{ abc | titlecase }}.

Sprawdź interfejs API Angular.io, aby uzyskać pełną listę.


1
To jest nieprawidłowa odpowiedź - w pytaniu prosi się o umieszczenie pierwszej litery ciągu na wielką literę, a nie na pierwszej literze każdego słowa.
Alex Peters

7

.capitalize {
  display: inline-block;
}

.capitalize:first-letter {
  font-size: 2em;
  text-transform: capitalize;
}
<span class="capitalize">
  really, once upon a time there was a badly formatted output coming from my backend, <strong>all completely in lowercase</strong> and thus not quite as fancy-looking as could be - but then cascading style sheets (which we all know are <a href="http://9gag.com/gag/6709/css-is-awesome">awesome</a>) with modern pseudo selectors came around to the rescue...
</span>


3

W przypadku AngularJS z meanjs.org niestandardowe filtry umieszczam w modules/core/client/app/init.js

Potrzebowałem niestandardowego filtra, aby zapisać każde słowo w zdaniu wielkimi literami, oto jak to zrobić:

angular.module(ApplicationConfiguration.applicationModuleName).filter('capitalize', function() {
return function(str) {
    return str.split(" ").map(function(input){return (!!input) ? input.charAt(0).toUpperCase() + input.substr(1).toLowerCase() :         ''}).join(" ");

}
});

Funkcja mapy przypisuje się @Naveen raj



2

Jeśli nie chcesz tworzyć niestandardowego filtra, możesz użyć go bezpośrednio

{{ foo.awesome_property.substring(0,1) | uppercase}}{{foo.awesome_property.substring(1)}}

2
var app = angular.module("app", []);
app.filter('capitalize', function() {
    return function(str) {
        if (str === undefined) return; // avoid undefined
        str = str.toLowerCase().split(" ");
        var c = '';
        for (var i = 0; i <= (str.length - 1); i++) {
            var word = ' ';
            for (var j = 0; j < str[i].length; j++) {
                c = str[i][j];
                if (j === 0) {
                    c = c.toUpperCase();
                }
                word += c;
            }
            str[i] = word;
        }
        str = str.join('');
        return str;
    }
});

2
Chociaż ten fragment kodu może być rozwiązaniem, dołączenie wyjaśnienia naprawdę pomaga poprawić jakość Twojego posta. Pamiętaj, że odpowiadasz na pytanie do czytelników w przyszłości, a osoby te mogą nie znać powodów, dla których zaproponowałeś kod.
peacetype

1

Aby dodać własne podejście do tej kwestii, sam użyłbym niestandardowej dyrektywy;

app.directive('capitalization', function () {
return {
    require: 'ngModel',
    link: function (scope, element, attrs, modelCtrl) {

        modelCtrl.$parsers.push(function (inputValue) {

            var transformedInput = (!!inputValue) ? inputValue.charAt(0).toUpperCase() + inputValue.substr(1).toLowerCase() : '';

            if (transformedInput != inputValue) {
                modelCtrl.$setViewValue(transformedInput);
                modelCtrl.$render();
            }

            return transformedInput;
        });
    }
};

Po zadeklarowaniu możesz umieścić w swoim HTML, jak poniżej;

<input ng-model="surname" ng-trim="false" capitalization>

1

Zamiast tego, jeśli chcesz zapisywać każde słowo w zdaniu wielką literą, możesz użyć tego kodu

app.filter('capitalize', function() {


return function(input, scope) {
if (input!=null)
input = input.toLowerCase().split(' ');

for (var i = 0; i < input.length; i++) {
   // You do not need to check if i is larger than input length, as your for does that for you
   // Assign it back to the array
   input[i] = input[i].charAt(0).toUpperCase() + input[i].substring(1);     


}
   // Directly return the joined string
   return input.join(' '); 
  }
});

i po prostu dodaj filtr „wielką literą” do tekstu wejściowego, na przykład - {{nazwa | skapitalizować}}


0

w Angular 4 lub CLI możesz stworzyć PIPE w ten sposób:

import { Pipe, PipeTransform } from '@angular/core';
@Pipe({
  name: 'capitalize'
})
/**
 * Place the first letter of each word in capital letters and the other in lower case. Ex: The LORO speaks = The Loro Speaks
 */
export class CapitalizePipe implements PipeTransform {
  transform(value: any): any {
    value = value.replace('  ', ' ');
    if (value) {
      let w = '';
      if (value.split(' ').length > 0) {
        value.split(' ').forEach(word => {
          w += word.charAt(0).toUpperCase() + word.toString().substr(1, word.length).toLowerCase() + ' '
        });
      } else {
        w = value.charAt(0).toUpperCase() + value.toString().substr(1, value.length).toLowerCase();
      }
      return w;
    }
    return value;
  }
}

0

Angular ma „titlecase”, który zaczyna się wielką literą w ciągu

Na przykład:

envName | titlecase

będzie wyświetlany jako EnvName

Używając z interpolacją, unikaj wszelkich spacji, takich jak

{{envName|titlecase}}

a pierwsza litera wartości envName zostanie wydrukowana wielkimi literami.


1
Nie daje to żadnej wartości powyższej odpowiedzi
Ivan Kaloyanov

1
To jest nieprawidłowa odpowiedź - w pytaniu prosi się o umieszczenie pierwszej litery ciągu na wielką literę, a nie na pierwszej literze każdego słowa.
Alex Peters

0
if (value){
  value = (value.length > 1) ? value[0].toUpperCase() + value.substr(1).toLowerCase() : value.toUpperCase();
}

-1

Możesz dodać wielkie litery w czasie wykonywania funkcji jako:

<td>{{lastName.charAt(0).toUpperCase()+ lastName.substr(1).toLowerCase()}}</td>


-2

Dodając do odpowiedzi Nidhisha,

Dla osób, które używają AngularJs i chcą zacząć wielką literę każdego słowa w ciągu, użyj poniższego kodu:

var app = angular.module('app', []);

app.controller('Ctrl', function ($scope) {
   $scope.msg = 'hello, world.';
});

app.filter('titlecase', function() {
    return function(input) {
      //Check for valid string
      if(angular.isString(input) && input.length > 0) {
        var inputArray = input.split(' ');
        for(var i=0; i<inputArray.length; i++) {
          var value = inputArray[i];
          inputArray[i] =  value.charAt(0).toUpperCase() + value.substr(1).toLowerCase();
        }
        return inputArray.join(' ');
      } else {
        return input;
      }
    };
});
<script src="https://ajax.googleapis.com/ajax/libs/angularjs/1.2.23/angular.min.js"></script>
<div ng-app="app">
    <div ng-controller="Ctrl">
        <p><b>My Text:</b> {{msg | titlecase}}</p>
    </div>
</div>

Korzystając z naszej strony potwierdzasz, że przeczytałeś(-aś) i rozumiesz nasze zasady używania plików cookie i zasady ochrony prywatności.
Licensed under cc by-sa 3.0 with attribution required.