ใช้อักษรตัวแรกของสตริงเป็นตัวพิมพ์ใหญ่ใน AngularJs


136

ฉันต้องการใช้อักษรตัวแรกของสตริงเป็นตัวพิมพ์ใหญ่ใน 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

12
ซึ่งสามารถทำได้โดยใช้ CSS เช่นกัน .. ดู text-transform: capitalize property
Ramanathan Muthuraman

1
คุณสามารถใช้วิธีนี้ได้หากคุณต้องการใช้เชิงมุม: codepen.io/WinterJoey/pen/sfFaK
Yousef_Shamshoum

1
สร้างคำสั่ง / ตัวกรองง่ายๆที่จะสร้างอักษรตัวแรกของคำให้คุณ ...
Pankaj Parkar

คำตอบ:


235

ใช้ตัวกรองตัวพิมพ์ใหญ่นี้

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;ร่างกายของฟังก์ชั่นที่ควรจะเป็นนี้: หากไม่ใช่สตริงให้ส่งคืนโดยไม่เปลี่ยนแปลง
Jabba

2
นี่คือการเขียนcodepen.io/WinterJoey/pen/sfFaK
Michal

149

ฉันจะบอกว่าอย่าใช้ angular / js เพราะคุณสามารถใช้ css แทน:

ใน css ของคุณเพิ่มคลาส:

.capitalize {
   text-transform: capitalize;
}

จากนั้นห่อนิพจน์ (เช่น) ใน html ของคุณ:

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

ไม่จำเป็นต้องใช้ js;)


7
การแปลงนี้จะใช้อักษรตัวพิมพ์ใหญ่ตัวแรกของแต่ละคำดังนั้นจึงใช้ได้กับสตริงคำเดียวเท่านั้น
jakub.g

22
@ jakub.g หากคุณต้องการใช้อักษรตัวพิมพ์ใหญ่เป็นตัวพิมพ์ใหญ่ (เช่นตัวอักษร) เพียงแค่ขยายตัวเลือก css ด้วย:first-letterตัวเลือกองค์ประกอบหลอก มีอะไรเหลืออีกไหม? :)
Philzen

2
@ ฟิลเซนใช่! คุณจะทำอย่างไรกับ html เท่านั้น ;-)
Romain Vincent

@RomainVincent "HTML เท่านั้น" หมายความว่าอย่างไร คำตอบของฉันด้านล่างอาจช่วยได้ (เพียงคลิก "เรียกใช้ข้อมูลโค้ด" เพื่อดูการทำงานจริง) เนื้อหา HTML เป็นแบบคงที่อย่างน้อยคุณจะต้องโยน CSS หรือ JS บางส่วนเพื่อแก้ไขรูปแบบตามลำดับเนื้อหา DOM
Philzen

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>

สังเกตว่าการใช้อักษรตัวพิมพ์ใหญ่จะเปลี่ยนเฉพาะอักษรตัวแรกของแต่ละคำอย่างไรโดยปล่อยให้ตัวอักษรอื่นไม่ได้รับผลกระทบ


วิธีที่ง่ายและรวดเร็วในการบรรลุเป้าหมายนอกจากนี้ยังใช้อักษรตัวแรกของทุกคำในสตริงซึ่งเป็นตัวพิมพ์ใหญ่
kisanme

เบื้องหลังเพิ่งใช้text-transform: capitalize;
cameck

27

หากคุณใช้ Angular 4+ คุณสามารถใช้ไฟล์ titlecase

{{toUppercase | titlecase}}

ไม่ต้องเขียนท่อใด ๆ


4
นี่เป็นคำตอบที่ไม่ถูกต้องคำถามจะขอให้ใช้อักษรตัวแรกของสตริงเป็นตัวพิมพ์ใหญ่ไม่ใช่ตัวอักษรตัวแรกของทุกคำ
Alex Peters


18

หากคุณอยู่หลังการแสดงพยายามหลีกเลี่ยงการใช้ตัวกรอง AngularJS เนื่องจากจะใช้สองครั้งต่อแต่ละนิพจน์เพื่อตรวจสอบความเสถียร

วิธีที่ดีกว่าคือการใช้::first-letterองค์ประกอบหลอกCSS กับ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
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(' '); 
  }
});

และเพิ่มตัวกรอง "ตัวพิมพ์ใหญ่" ให้กับอินพุตสตริงของคุณเช่น - {{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 มี 'titlecase' ซึ่งใช้อักษรตัวแรกเป็นตัวพิมพ์ใหญ่ในสตริง

สำหรับอดีต:

envName | titlecase

จะแสดงเป็น EnvName

เมื่อใช้กับการแก้ไขหลีกเลี่ยงช่องว่างทั้งหมดเช่น

{{envName|titlecase}}

และอักษรตัวแรกของค่า envName จะพิมพ์เป็นตัวพิมพ์ใหญ่


1
สิ่งนี้ไม่ได้ให้คุณค่าใด ๆ กับคำตอบข้างต้น
Ivan Kaloyanov

1
นี่เป็นคำตอบที่ไม่ถูกต้องคำถามจะขอให้ใช้อักษรตัวแรกของสตริงเป็นตัวพิมพ์ใหญ่ไม่ใช่ตัวอักษรตัวแรกของทุกคำ
Alex Peters


0

คุณสามารถลองแบ่ง String ของคุณออกเป็นสองส่วนและจัดการเคสแยกกัน

{{ (Name.charAt(0) | uppercase) + "" + (Name.slice(1, element.length) | lowercase) }}

หรือ

{{ Name.charAt(0) | uppercase }} {{ Name.slice(1, element.length) | lowercase  }}


โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.