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

134

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

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

Piyush
источник
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;)

TrampGuy
источник
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 изменяет только первую букву каждого слова, оставляя регистр любых других букв неизменным.

minimalpop
источник
Быстрый и простой способ достижения цели, также это делает первую букву каждого слова в строке заглавной, что здорово.
Кисанме
за кулисами это просто используетсяtext-transform: capitalize;
Cameck
27

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

{{toUppercase | titlecase}}

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

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

хороший способ

app.filter('capitalize', function() {
  return function(token) {
      return token.charAt(0).toUpperCase() + token.slice(1);
   }
});
Патрик Меландер
источник
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(' ') : '';
    }
});
Навин Радж
источник
11

Это еще один способ:

{{some_str | limitTo:1 | uppercase}}{{some_str.substr(1) | lowercase }}
Паллав Дешмукх
источник
9

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

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

windmaomao
источник
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>

Philzen
источник
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;
    }
});
murali2486
источник
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>
uk2k05
источник
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;
  }
}
eberlast
источник
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>
Рахул Манкар
источник
-1

{{ uppercase_expression | capitaliseFirst}} должно сработать

Хасан Шайк
источник
-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>

Панкай
источник