Используйте первую букву строки в AngularJs


134

Я хочу использовать первый символ строки в angularjs

Как я использовал {{ uppercase_expression | uppercase}}это преобразовать всю строку в верхний регистр.


1
Да, вам придется написать код. Angular не сделает все за вас. developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/… , developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/…
JB Nizet

11
Это также можно сделать с помощью CSS. Проверьте свойство text-transform: capitalize
Раманатан Мутураман,

1
Вы можете использовать это решение, если вы действительно хотите использовать angular: codepen.io/WinterJoey/pen/sfFaK
Yousef_Shamshoum

1
создайте простую директиву / фильтр, который сделает первую букву слова для вас заглавной ...
Панкадж Паркар,

Ответы:


234

использовать этот фильтр с заглавной буквы

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
Вы получаете сообщение об ошибке, если хотите случайно набрать номер. Тело функции должно быть таким: return (angular.isString(s) && s.length > 0) ? s[0].toUpperCase() + s.substr(1).toLowerCase() : s;. Если это не строка, верните ее без изменений.
Джабба

2
Здесь написан пользовательский фильтр капитализации codepen.io/WinterJoey/pen/sfFaK
Михал

148

Я бы сказал, не используйте angular / js, так как вместо этого вы можете просто использовать css:

В своем CSS добавьте класс:

.capitalize {
   text-transform: capitalize;
}

Затем просто оберните выражение (например) в свой html:

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

Не нужно JS;)


7
Это преобразование будет использовать первую букву каждого слова с заглавной буквы, поэтому применимо только к строкам из одного слова
jakub.g 02

22
@ jakub.g Если вы просто хотите использовать первое слово (ну, букву) с большой буквы, просто расширьте селектор CSS с помощью селектора псевдоэлементов :first-letter. Что-нибудь еще не прикрыто? :)
Филцен

2
@Philzen Да! Как бы вы сделали это только с HTML? ;-)
Romain Vincent

@RomainVincent Что вы подразумеваете под «только HTML»? Возможно, мой ответ ниже поможет (просто нажмите «Выполнить фрагмент кода», чтобы увидеть его в действии). HTML-контент статичен, вам, по крайней мере, нужно будет добавить CSS или JS, чтобы изменить его стиль, соответственно содержимое DOM.
Филзен

4
Извините, это была неудачная попытка пошутить.
Romain Vincent

57

Если вы используете Bootstrap , вы можете просто добавить text-capitalizeвспомогательный класс:

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

РЕДАКТИРОВАТЬ: на всякий случай ссылка снова умирает:

Преобразование текста

Преобразуйте текст в компоненты с помощью классов капитализации текста.

текст в нижнем регистре.
Перевернутый текст.
CapiTaliZed текст.

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

Обратите внимание, как text-capitalize изменяет только первую букву каждого слова, оставляя регистр любых других букв неизменным.


Быстрый и простой способ достижения цели, также это делает первую букву каждого слова в строке заглавной, что здорово.
Кисанме

за кулисами это просто используетсяtext-transform: capitalize;
Cameck

27

Если вы используете Angular 4+, вы можете просто использовать titlecase

{{toUppercase | titlecase}}

не нужно писать трубы.


4
Это неправильный ответ - вопрос требует прописывать первую букву строки, а не первую букву каждого слова.
Alex Peters


18

Если вам не хватает производительности, старайтесь избегать использования фильтров AngularJS, так как они применяются дважды для каждого выражения, чтобы проверить их стабильность.

Лучшим способом было бы использовать псевдоэлемент CSS ::first-letterс расширением text-transform: uppercase;. Это не может быть использовано для встроенных элементов, таких как span, тем не менее, поэтому следующим лучшим вариантом будет использование text-transform: capitalize;всего блока, который использует каждое слово с заглавной буквы.

Пример:

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
К сожалению ::first-letter, не работает на display: inlineили display: flex, только на display:blockили inline-blockэлементы
jakub.g

18

Мне нравится ответ от @TrampGuy

CSS всегда (ну, не всегда) лучший выбор, поэтому: text-transform: capitalize; безусловно, способ.

Но что, если ваш контент для начала написан прописными буквами? Если вы попробуете text-transform: capitalize;такой контент, как «FOO BAR», вы все равно получите «FOO BAR» на вашем дисплее. Чтобы обойти эту проблему, вы можете поместить text-transform: capitalize;в свой css, но также в строчную строку, поэтому:

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

где мы используем класс капитализации @ TrampGuy:

.capitalize {
  text-transform: capitalize;
}

Итак, притворившись, foo.awsome_propertyчто обычно печатается «FOO BAR», теперь он напечатает желаемый «Foo Bar».


14

если вы хотите использовать каждое слово в строке с заглавной буквы (в процессе -> в процессе), вы можете использовать такой массив.

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


9

Для Angular 2 и выше вы можете использовать {{ abc | titlecase }}.

Проверьте Angular.io API для полного списка.


1
Это неправильный ответ - вопрос требует прописывать первую букву строки, а не первую букву каждого слова.
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

Для AngularJS с сайта meanjs.org я помещаю настраиваемые фильтры в modules/core/client/app/init.js

Мне нужен был настраиваемый фильтр, чтобы каждое слово в предложении было заглавным, вот как я это делаю:

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(" ");

}
});

Кредит функции карты принадлежит @Naveen raj



2

Если вы не хотите создавать собственный фильтр, вы можете напрямую использовать

{{ 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
Хотя этот фрагмент кода может быть решением, включение пояснения действительно помогает улучшить качество вашего сообщения. Помните, что вы отвечаете на вопрос читателей в будущем, и эти люди могут не знать причин, по которым вы предлагаете код.
Peacetype

1

Просто чтобы добавить свой взгляд на этот вопрос, я бы сам использовал специальную директиву;

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;
        });
    }
};

После объявления вы можете разместить его внутри своего HTML, как показано ниже;

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

1

Вместо этого, если вы хотите использовать каждое слово в предложении с большой буквы, вы можете использовать этот код

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(' '); 
  }
});

и просто добавьте фильтр "capitalize" к строке ввода, например - {{name | выгода}}


0

в Angular 4 или CLI вы можете создать PIPE следующим образом:

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 есть заголовок, который делает первую букву в строке заглавной.

Например:

envName | titlecase

будет отображаться как EnvName

При использовании с интерполяцией избегайте всех пробелов, например

{{envName|titlecase}}

и первая буква значения envName будет напечатана в верхнем регистре.


1
Это не дает никакого значения для ответа выше
Иван Калоянов

1
Это неправильный ответ - вопрос требует прописывать первую букву строки, а не первую букву каждого слова.
Alex Peters

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

-1

Вы можете добавить заглавные буквы во время выполнения как:

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


-2

Добавляя к ответу Нидиша,

Для людей, которые используют AngularJs и хотят использовать заглавную первую букву каждого слова в строке, используйте следующий код:

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>

Используя наш сайт, вы подтверждаете, что прочитали и поняли нашу Политику в отношении файлов cookie и Политику конфиденциальности.
Licensed under cc by-sa 3.0 with attribution required.