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.

Piyush
źródło
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>

Nidhish Krishnan
źródło
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;)

TrampGuy
źródło
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.

minimalpop
źródło
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.

Abhishek Ekaanth
źródło
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);
   }
});
Patrik Melander
źródło
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>

Gregor Eesmaa
źródło
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”.

Ryan Crews
źródło
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(' ') : '';
    }
});
Naveen raj
źródło
11

To jest inny sposób:

{{some_str | limitTo:1 | uppercase}}{{some_str.substr(1) | lowercase }}
pallav deshmukh
źródło
9

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

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

windmaomao
źródło
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>

Philzen
źródło
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

Maxim Mai
źródło
3

W wersji kątowej 7+ z wbudowaną rurką

{{ yourText | titlecase  }}
Ahmad Sharif
źródło
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)}}
Chhitij Srivastava
źródło
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;
    }
});
murali2486
źródło
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>
uk2k05
źródło
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ć}}

Akash Saxena
źródło
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;
  }
}
eberlast
źródło
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.

Vedha Peri
źródło
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();
}
Ali
źródło
-1

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

<td>{{lastName.charAt(0).toUpperCase()+ lastName.substr(1).toLowerCase()}}</td>
Rahul Mankar
źródło
-1

{{ uppercase_expression | capitaliseFirst}} powinno działać

Hasan Shaik
źródło
-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>

Pankaj
źródło