Bagaimana saya bisa menyalin objek dan kehilangan referensi di Angular?
Dengan AngularJS, saya bisa menggunakan angular.copy(object)
, tapi saya mendapatkan beberapa kesalahan saat menggunakannya di Angular.
PENGECUALIAN: ReferenceError:
angular
tidak didefinisikan
.copy()
tetapi sebenarnya tidak membutuhkannya. Dalam berbagai proyek AngJS1 yang saya lihat, itu adalah pembunuhan yang berlebihan, di mana salinan manual dari substruktur yang relevan akan dibuat untuk kode yang lebih bersih. Mungkin itu adalah bagian dari keputusan untuk tidak mengimplementasikannya oleh tim Angular.Jawaban:
Dengan asumsi Anda menggunakan ES6, Anda dapat menggunakan
var copy = Object.assign({}, original)
. Bekerja di peramban modern; jika Anda perlu mendukung browser lama, periksa polyfill inimemperbarui:
Dengan TypeScript 2.1+, notasi penyebaran objek steno ES6 tersedia:
sumber
angular.copy()
membuat salinan yang dalam bertentangan denganObject.assign()
. Jika Anda ingin penyalinan dalam, gunakan lodash_.cloneDeep(value)
lodash.com/docs#cloneDeepUnresolved function or method assign()
; Rincian IDE: Webstorm 2016.2. Bagaimana saya bisa mengatasinya?File -> Settings -> Languages & Frameworks -> Javascript
dan setJavascript language version
keECMAScript 6.0
.const copy = [ ...original ]
Hingga kami memiliki solusi yang lebih baik, Anda dapat menggunakan yang berikut:
EDIT: Klarifikasi
Harap dicatat: Solusi di atas hanya dimaksudkan untuk memperbaiki satu liner, disediakan pada saat Angular 2 sedang dalam pengembangan aktif. Harapan saya adalah kita akhirnya bisa mendapatkan yang setara
angular.copy()
. Karena itu saya tidak ingin menulis atau mengimpor perpustakaan kloning yang dalam.Metode ini juga memiliki masalah dengan properti tanggal parsing (itu akan menjadi string).
Tolong jangan gunakan metode ini di aplikasi produksi . Gunakan hanya dalam proyek eksperimental Anda - yang Anda lakukan untuk mempelajari Angular 2.
sumber
Alternatif untuk menyalin objek dalam yang memiliki objek bersarang di dalamnya adalah dengan menggunakan metode cloneDeep lodash.
Untuk Angular, Anda dapat melakukannya seperti ini:
Instal lodash dengan
yarn add lodash
ataunpm install lodash
.Di komponen Anda, impor
cloneDeep
dan gunakan:Ini hanya 18kb ditambahkan ke bangunan Anda, layak untuk manfaatnya.
Saya juga sudah menulis artikel di sini , jika Anda perlu wawasan lebih lanjut tentang mengapa menggunakan cloneDeep lodash.
sumber
cloneDeep
metode ini instantiate objek baru. Haruskah kita masih menggunakannya jika kita sudah memiliki objek tujuan?Untuk menyalin dangkal Anda bisa menggunakan Object.assign yang merupakan fitur ES6
JANGAN menggunakannya untuk kloning yang dalam
sumber
Gunakan lodash sebagaimana ditunjukkan pertandg. Alasan angular tidak lagi memiliki metode ini, adalah karena sudut 1 adalah kerangka kerja yang berdiri sendiri, dan perpustakaan eksternal sering mengalami masalah dengan konteks eksekusi sudut. Angular 2 tidak memiliki masalah itu, jadi gunakan perpustakaan apa pun yang Anda inginkan.
https://lodash.com/docs#cloneDeep
sumber
Jika Anda ingin menyalin instance kelas, Anda dapat menggunakan Object.assign juga, tetapi Anda harus memberikan instance baru sebagai parameter pertama (alih-alih {}):
sumber
Solusi paling sederhana yang saya temukan adalah:
* LANGKAH PENTING: Anda harus menginstal lodash untuk menggunakan ini (yang tidak jelas dari jawaban lain):
dan kemudian impor dalam file ts Anda:
sumber
Seperti yang telah ditunjukkan orang lain, menggunakan lodash atau garis bawah mungkin adalah solusi terbaik. Tetapi jika Anda tidak membutuhkan perpustakaan itu untuk hal lain, Anda mungkin dapat menggunakan sesuatu seperti ini:
Itulah yang kami putuskan untuk lakukan.
sumber
Saya membutuhkan fitur ini hanya dari 'model' aplikasi saya (data backend mentah dikonversi menjadi objek). Jadi saya akhirnya menggunakan kombinasi Object.create (membuat objek baru dari prototipe yang ditentukan) dan Object.assign (menyalin properti antar objek). Perlu menangani salinan dalam secara manual. Saya membuat intisari untuk ini.
sumber
Punya masalah yang sama, dan tidak ingin menggunakan plugin apa pun hanya untuk kloning mendalam:
Penghargaan: Saya membuat fungsi ini lebih mudah dibaca , silakan periksa pengecualian untuk fungsinya di bawah ini
sumber
Saya telah membuat layanan untuk digunakan dengan Angular 5 atau lebih tinggi, menggunakan
angular.copy ()
basis angularjs, ini berfungsi dengan baik untuk saya. Selain itu ada fungsi lain sepertiisUndefined
, dll. Saya harap ini membantu. Seperti pengoptimalan apa pun, akan menyenangkan untuk diketahui. salamsumber
Saya dan Anda juga menghadapi masalah pekerjaan angular.copy dan angular.expect karena mereka tidak menyalin objek atau membuat objek tanpa menambahkan beberapa dependensi. Solusi saya adalah ini:
sumber
The
JSON.stringify()
Metode mengkonversi objek JavaScript atau nilai ke string JSONsumber
Anda dapat mengkloning seperti Array
Dan tirukan objek seperti
sumber
Jika Anda belum menggunakan lodash, saya tidak akan merekomendasikan menginstalnya hanya untuk metode yang satu ini. Saya sarankan sebagai gantinya perpustakaan khusus yang lebih sempit seperti 'klon':
sumber