Angular.js: Fitur: ngTrueValue harus menerima nilai non-string

Dibuat pada 25 Jul 2012  ·  60Komentar  ·  Sumber: angular/angular.js

Untuk kotak centang ng-model, ngTrueValue hanya mendukung string. Seharusnya benar-benar hanya menerima ekspresi sudut dan eval untuk mendapatkan nilai sehingga mendukung katakanlah objek js.

PRs plz! forms moderate feature

Komentar yang paling membantu

Saya baru saja mendapatkan kesadaran yang menarik. Apa yang saya coba lakukan - dan dari kelihatannya, apa yang banyak dari Anda telah coba lakukan - sebenarnya dapat dicapai dengan:

ng-true-value="{{ myVariable | json }}"

Ini mendukung nilai string, boolean, dan angka. Belum yakin apakah saya benar-benar menyukai ini, tetapi saya yakin itu menghibur. Dan mungkin ini akan membantu orang lain.

Semua 60 komentar

Saya tidak sepenuhnya yakin dengan tujuan ngTrueValue , kecuali sepertinya petunjuk praktis untuk menambahkan jam tangan ke pengontrol untuk satu kasing. Saya menduga bahwa jika Anda ingin menetapkan beberapa model ke nilai yang kompleks, mungkin lebih bersih untuk menempatkan $scope.$watch pada model kotak centang Anda dan memodifikasi model pada cakupan yang sesuai.

@coli , apakah Anda memiliki kasus penggunaan khusus? @IgorMinar , @mhevery , @vojtajina , bagaimana menurut kalian?

Use case sebenarnya cukup umum:

Saya memiliki larik objek kategori say di say $scope.categories=[{id:5,name:"First"},...}

Lalu saya memiliki array SelectCategories yang berisi subset dari kategori tersebut.

Saya ingin menampilkan kotak centang untuk beberapa kategori (paging), dan ketika Anda mencentang atau menghapus centang pada kotak, kategori yang dipilih diubah.

Saya sebenarnya menulis arahan yang akan menimpa perilaku kotak centang default untuk menambahkan dukungan untuk hal di atas. Saya dapat membagikan kode jika diperlukan.

Penggunaan saya berakhir seperti ini, keyField diperlukan untuk melakukan perbandingan objek seperti dalam kasus saya, objek grup yang dipilih dan objek grup dapat sedikit berbeda pada awalnya (mereka berasal dari 2 API backend yang berbeda)

<ng-repeat="group in groups>
    <input type='checkbox' ng-model="selectedArray" ng-true-value="group" mi-checkbox="{keyField:'id'}">
</>

Heck, saya memiliki kasus penggunaan yang jauh lebih sederhana yang saya kecewa karena tidak berfungsi - saya membutuhkan bilangan bulat, daripada string!

Saya menggunakan template untuk membuat kontrol kotak centang. Dalam hal ini saya tidak dapat mengetahui nilai sebenarnya, nilai itu tergantung pada informasi kontrol khusus yang ingin saya render.

Saya juga lebih suka ng-true-value menjadi ekspresi. Jika jumlah kotak centang Anda ditentukan pada saat run time, Anda harus menggunakan metode cakupan dengan pembungkus batas waktu.

+1. Mendukung ekspresi dalam ng-true-value

+1 Mendukung bilangan bulat di ng-true-value

+1 untuk ekspresi alih-alih string

+1 Mendukung ekspresi!

+1 untuk ekspresi

+1 Mendukung objek:

<div ng-repeat="group in groups">
    <input type='checkbox' ng-model="array[$index]" ng-true-value="group" />
</div>

@coli maukah Anda membagikan arahan yang Anda tulis? Ini akan sangat membantu saya saat masalah ini masih dipertimbangkan. Mungkin dalam inti?

@brab Sayangnya saya menulisnya di pekerjaan sebelumnya, tetapi pada dasarnya, ini mirip dengan kode bawaan untuk kotak centang, saya menyalin/menempel ke direktif khusus dan menambahkan dukungan ekspresi. (+ peretasan jelek untuk menghapus yang ada di dalamnya)

Ekspresi akan sangat bagus! Namun, bahkan pengujian kebenaran javascript untuk bilangan bulat diharapkan. Saya menggunakan $resource untuk mengisi objek yang mengembalikan nilai integer (1 atau 0) dari database boolean. Ini kemudian dilampirkan ke $scope yang ng-model pada input terikat. Benar-benar terkejut mengetahui pengaturan ng-true-value="1" tidak akan mengenali bilangan bulat 1 sebagai benar dan centang kotaknya. Akan melihat metode lain yang disebutkan sementara itu.

+1

+1 untuk ekspresi

+1. Mendukung ekspresi dalam ng-true-value

+1 pada ekspresi pendukung!
Dalam kasus saya, perlu membangun formulir secara dinamis.
Misalnya: http://jsfiddle.net/federosky/N8Wjm/5/

+1 untuk bilangan bulat

1+ untuk bilangan bulat

+1 untuk bilangan bulat (atau nomor JS apa pun)

:+1: untuk ekspresi pendukung tolong! silakan! silahkan! :-)

+1 setidaknya untuk dukungan integer, lebih disukai ekspresi juga.

Bagaimana seseorang mengajukan PR untuk mendukung nomor?

+1 untuk ekspresi

+1 untuk bilangan bulat

+1 untuk bilangan bulat

+1

:+1: untuk ekspresi.

+1. Baru saja mengalami masalah ketika saya memiliki properti boolean 'tersembunyi' yang harus direpresentasikan sebagai kotak centang 'Terlihat' pada halaman. Jadi, saya perlu status 'dicentang' untuk berarti FALSE dan tidak dicentang untuk berarti 'TRUE'.

Saya ingin tahu apa solusi mudah untuk masalah ini? Saya tidak terlalu suka menulis arahan kotak centang saya sendiri atau mencemari ruang lingkup dengan properti boolean bantu terbalik hanya untuk menggunakannya untuk pengikatan tidak langsung.

Ini mungkin cukup sepele untuk diterapkan, saya akan mencobanya sebelum tidur.

Tambalan saya hanya mendukung ekspresi konstan, tetapi jika orang benar-benar membutuhkannya, saya kira ekspresi apa pun sudah cukup. Ini adalah cara termudah untuk tidak menyebabkan perubahan yang merusak.

+1

+1

+1

+1 untuk tipe bilangan bulat

+1

+1 untuk ekspresi

+1

+1

+1

+1

:+1:

Ini adalah peretasan yang diperlukan sekarang (banyak WTF):

<input type="checkbox" ng-model="fake" ng-checked="!notChecked" ng-change="notChecked = !notChecked"/>

+1

+1 sudah dua tahun "+1". Mengapa kita belum mendukung ini?

@jancarloviray , +1

Sayang sekali: Bagi saya ini berarti segalanya menjadi lebih rumit.
Sebelumnya saya menggunakan
ng-true-value="{{proxyOnValue}}"
di mana proxyOnValue diinisialisasi dalam pengontrol.
(Tampilan yang sama digunakan kembali untuk konfigurasi proxy HTTP/HTTPS/FTP/POP3/SMTP di mana nilai sebenarnya berbeda.)

Sekarang saya mencoba
ng-true-value="proxyOnValue"
tapi itu menimbulkan pengecualian karena ekspresinya tidak konstan.

Jadi ini berarti saya harus mengganti implementasi sederhana (ngTrueValue) dengan implementasi yang lebih kompleks (watch atau Object.defineProperty), jadi sebenarnya kebalikan dari apa yang dimaksudkan.

Mengapa pembatasan buatan ini?
Hanya

  • gunakan nilai ngTrueValue/ngFalseValue saat ini setiap kali model berubah atau pengguna mengklik kotak centang
  • untuk ukuran yang baik, miliki arloji internal pada ekspresi ngTrueValue/ngFalseValue (jika tidak konstan) dan perbarui status kotak centang saat arloji dipicu.

@eekboom - Anda masih dapat menggunakan interpolasi Anda: http://plnkr.co/edit/LQ6OpFjkjiFLxxMJ9hxj?p=preview

@petebacondarwin - dia dapat menggunakan interpolasi, tetapi itu tidak akan membantunya: http://plnkr.co/edit/nNwjEkPIDJwe60HWX950?p=preview
Nilai diperiksa hanya sekali - perubahan selanjutnya tidak diperhitungkan, jadi hanya nilai awal yang selalu digunakan.

@dliebscher - pemahaman saya adalah bahwa @eekboom hanya ingin menginisialisasi sekali:

Sebelumnya saya menggunakan ng-true-value="{{proxyOnValue}}" di mana proxyOnValue diinisialisasi di controller.

Ya dan tidak: Saya ingin menginisialisasi hanya sekali, tetapi hanya setelah konfigurasi proxy dimuat melalui xhr. Jadi itu berubah (dari tidak terdefinisi) sekali setelah tampilan diinisialisasi.

@eekboom
Ketika saya bermigrasi dari 1.2, saya beralih ke yang berikut:

ng-true-value="{{proxyOnValue}}"

ke

ng-true-value="'{{proxyOnValue}}'"

Yang berfungsi, tetapi terlihat bodoh

Saya baru saja mendapatkan kesadaran yang menarik. Apa yang saya coba lakukan - dan dari kelihatannya, apa yang banyak dari Anda telah coba lakukan - sebenarnya dapat dicapai dengan:

ng-true-value="{{ myVariable | json }}"

Ini mendukung nilai string, boolean, dan angka. Belum yakin apakah saya benar-benar menyukai ini, tetapi saya yakin itu menghibur. Dan mungkin ini akan membantu orang lain.

getu-lar saya sudah mencoba apa yang Anda katakan, dengan objek yang kompleks, itu berhasil. Di ng-false-value saya isi dengan ng-false-value="{}" .Sebelum berurusan dengan data, saya melewati filter untuk memotong semua nilai falsy dari array. Jadi, terima kasih banyak!

solusi getu-lar bekerja untuk saya. Terima kasih.

Saya mencoba menggunakan ekspresi yang diselesaikan menjadi string dengan garis bawah di dalamnya, misalnya "101_3". Saya menggunakan solusi getu-lar dan itu hanya berfungsi. Terasa seperti hack sekalipun. Terima kasih telah membagikannya!

+1 untuk ekspresi

+1

Sepertinya tidak ada banyak harapan bagi tim Angular untuk memberikan arahan kotak centang yang waras untuk seri 1.x... Itu tidak terlalu sulit. Dukungan ekspresi akan sepenuhnya kompatibel karena kutipan wajib.

Sampai saat itu solusi yang disarankan berfungsi untuk saya:

ng-true-value="{{ myVariable | json }}"

Pastikan myVariable didefinisikan di controller. Saya mencoba mendefinisikannya di tautan pos dan tidak berhasil.

Apakah halaman ini membantu?
0 / 5 - 0 peringkat