Apakah ada cara untuk menggunakan fungsi matematika di binding AngularJS?
misalnya
<p>The percentage is {{Math.round(100*count/total)}}%</p>
Biola ini menunjukkan masalahnya
Apakah ada cara untuk menggunakan fungsi matematika di binding AngularJS?
misalnya
<p>The percentage is {{Math.round(100*count/total)}}%</p>
Biola ini menunjukkan masalahnya
<p>The percentage is {{(100*count/total)| number:0}}%</p>
lebih banyak komentar di bawah ini.private Math = Math;
dan Anda dapat menggunakannya.Jawaban:
Anda harus menyuntikkan
Math
ke lingkup Anda, jika Anda perlu menggunakannya karena$scope
tidak tahu apa-apa tentang Matematika.Cara paling sederhana, bisa Anda lakukan
di controller Anda. Cara sudut untuk melakukan ini dengan benar akan membuat layanan Matematika, saya kira.
sumber
formatting
, jadi gunakan filter.Meskipun jawaban yang diterima benar bahwa Anda dapat menyuntikkan
Math
untuk menggunakannya dalam sudut, untuk masalah khusus ini, cara yang lebih konvensional / sudut adalah nomor filter:Anda dapat membaca lebih lanjut tentang
number
filter di sini: http://docs.angularjs.org/api/ng/filter/numbersumber
{{1234.567|number:2}}
dirender sebagai1,234.57
atau1 234,57
. Jika Anda mencoba meneruskannya,<input type="number" ng-value="1234.567|number:2">
Anda akan mengosongkan input, karena nilainya BUKAN NOMOR YANG BENAR, tetapi representasi string dependen lokal.Saya pikir cara terbaik untuk melakukannya adalah dengan membuat filter, seperti ini:
maka markupnya terlihat seperti ini:
Biola yang diperbarui: http://jsfiddle.net/BB4T4/
sumber
Ini adalah jawaban yang berbulu, karena Anda tidak memberikan konteks penuh dari apa yang Anda lakukan. Jawaban yang diterima akan berhasil, tetapi dalam beberapa kasus akan menyebabkan kinerja yang buruk. Itu, dan akan lebih sulit untuk diuji.
Jika Anda melakukan ini sebagai bagian dari bentuk statis, baiklah. Jawaban yang diterima akan bekerja, meskipun itu tidak mudah untuk diuji, dan itu membingungkan.
Jika Anda ingin menjadi "Sudut" tentang ini:
Anda harus menjaga "logika bisnis" apa pun (yaitu logika yang mengubah data yang akan ditampilkan) dari pandangan Anda. Ini agar Anda dapat menguji logika Anda, dan agar Anda tidak menyambungkan pengontrol dan tampilan Anda dengan erat. Secara teoritis, Anda harus dapat mengarahkan pengontrol Anda di tampilan lain dan menggunakan nilai yang sama dari cakupan. (jika itu masuk akal).
Anda juga harus mempertimbangkan bahwa fungsi apa pun yang memanggil bagian dalam pengikatan (seperti
{{}}
ataung-bind
ataung-bind-html
) harus dievaluasi pada setiap intisari , karena angular tidak memiliki cara untuk mengetahui apakah nilainya telah berubah atau tidak suka dengan properti. pada ruang lingkup.Cara "angular" untuk melakukan ini adalah dengan menyimpan nilai di properti pada lingkup perubahan menggunakan peristiwa ng-change atau bahkan $ watch.
Misalnya dengan bentuk statis:
Dan sekarang Anda bisa mengujinya!
sumber
$window
karena tampaknya bekerja dengan hanya rencanaMath.round()
?Math
tes. Secara alternatif, Anda dapat membuat layanan Matematika dan menyuntikkannya.Mengapa tidak membungkus seluruh obj matematika dalam filter?
dan untuk menggunakan:
{{number_var | matematika: 'ceil'}}
sumber
Pilihan yang lebih baik adalah menggunakan:
Ini menetapkan nilai default persamaan ke 0 dalam kasus ketika nilai tidak diinisialisasi.
sumber
Jika Anda ingin melakukan putaran sederhana di Angular, Anda dapat dengan mudah mengatur filter di dalam ekspresi Anda. Sebagai contoh:
{{ val | number:0 }}
Lihat contoh CodePen ini & untuk opsi filter nomor lainnya.
Documents sudut tentang menggunakan Filter Angka
sumber
Cara termudah untuk melakukan matematika sederhana dengan Angular adalah langsung di markup HTML untuk binding individual sesuai kebutuhan, dengan asumsi Anda tidak perlu melakukan perhitungan massal di halaman Anda. Ini sebuah contoh:
Dalam hal ini Anda cukup menghitung dalam () dan kemudian menggunakan filter | untuk mendapatkan nomor jawaban. Berikut ini info lebih lanjut tentang memformat angka sudut sebagai teks:
https://docs.angularjs.org/api/ng/filter
sumber
Baik mengikat objek Matematika global ke lingkup (ingat untuk menggunakan $ window bukan window)
Gunakan penjilidan di HTML Anda:
Atau buat filter untuk fungsi Matematika spesifik yang Anda cari:
Gunakan filter dalam HTML Anda:
sumber
Itu tidak terlihat seperti cara yang sangat Angular untuk melakukannya. Saya tidak sepenuhnya yakin mengapa itu tidak berhasil, tetapi Anda mungkin perlu mengakses ruang lingkup untuk menggunakan fungsi seperti itu.
Saran saya adalah membuat filter. Itu jalan Angular.
Kemudian di HTML Anda lakukan ini:
sumber
The
number
Filter membentuk angka dengan pemisah ribuan, sehingga tidak ketat fungsi matematika.Selain itu, 'limiter' desimalnya tidak
ceil
berupa desimal cincang (karena beberapa jawaban lain akan membuat Anda percaya), tetapi sebaliknyaround
.Jadi untuk fungsi matematika yang Anda inginkan, Anda dapat menyuntikkannya (lebih mudah untuk mengejek daripada menyuntikkan seluruh objek Matematika) seperti:
Tidak perlu membungkusnya di fungsi lain juga.
sumber
Ini kurang lebih adalah ringkasan dari tiga jawaban (oleh Sara Inés Calderón, klaxon dan Gothburz), tetapi karena mereka semua menambahkan sesuatu yang penting, saya menganggapnya layak untuk bergabung dengan solusi dan menambahkan beberapa penjelasan lebih lanjut.
Mempertimbangkan contoh Anda, Anda dapat melakukan perhitungan dalam template Anda menggunakan:
Namun, ini dapat menghasilkan banyak tempat desimal, jadi menggunakan filter adalah cara yang baik:
Secara default, filter angka akan meninggalkan hingga tiga digit fraksional , di sinilah argumen fractionSize sangat berguna (
{{ 100 * (count/total) | number:fractionSize }}
), yang dalam kasus Anda adalah:Ini juga akan melengkapi hasilnya:
Tampilkan cuplikan kode
Hal terakhir yang disebutkan, jika Anda mengandalkan sumber data eksternal, mungkin merupakan praktik yang baik untuk memberikan nilai cadangan yang tepat (jika tidak, Anda mungkin melihat NaN atau tidak sama sekali di situs Anda):
Sidenote: Tergantung pada spesifikasi Anda, Anda bahkan mungkin dapat lebih tepat dengan fallback Anda / tentukan fallback pada level yang lebih rendah (mis
{{(100 * (count || 10)/ (total || 100) | number:2)}}
.). Padahal, ini mungkin tidak selalu masuk akal ..sumber
Contoh skrip Angular menggunakan pipa.
math.pipe.ts
Tambahkan ke deklarasi @NgModule
kemudian gunakan di template Anda seperti ini:
sumber