Saya memiliki petunjuk ckEditor berikut. Di bagian bawah ada dua variasi yang telah saya lihat dari contoh cara mengatur data di editor:
app.directive('ckEditor', [function () {
return {
require: '?ngModel',
link: function ($scope, elm, attr, ngModel) {
var ck = null;
var config = attr.editorSize;
if (config == 'wide') {
ck = CKEDITOR.replace(elm[0], { customConfig: 'config-wide.js' });
} else {
ck = CKEDITOR.replace(elm[0], { customConfig: 'config-narrow.js' });
}
function updateModel() {
$scope.$apply(function () {
ngModel.$setViewValue(ck.getData());
});
}
$scope.$on('modalObjectSet', function (e, modalData) {
// force a call to render
ngModel.$render();
});
ck.on('change', updateModel);
ck.on('mode', updateModel);
ck.on('key', updateModel);
ck.on('dataReady', updateModel);
ck.on('instanceReady', function () {
ngModel.$render();
});
ck.on('insertElement', function () {
setTimeout(function () {
$scope.$apply(function () {
ngModel.$setViewValue(ck.getData());
});
}, 1000);
});
ngModel.$render = function (value) {
ck.setData(ngModel.$modelValue);
};
ngModel.$render = function (value) {
ck.setData(ngModel.$viewValue);
};
}
};
}])
Dapatkah seseorang memberi tahu saya apa perbedaan antara:
ck.setData(ngModel.$modelValue);
ck.setData(ngModel.$viewValue);
Dan mana yang harus saya gunakan. Saya melihat dokumentasi sudut dan dikatakan:
$viewValue
Actual string value in the view.
$modelValue
The value in the model, that the control is bound to.
Saya tidak mengerti apa yang penulis maksud ketika dia menulis ini di dokumen :-(
$viewValue
apakah selalu berupa string?$viewValue: Actual string value in the view.
. Jadi iya.<input type="text">
nilai kosong,$modelValue
propertiundefined
, sedangkan$viewValue
adalah''
string kosong. Ini bisa membuat perbedaan jika Anda mengendus "panjang"$modelValue
yang tidak akan berhasil, tetapi$viewValue
akan.$viewValue
tidak selalu berupa string. Ini adalah string untuk arahan inti Angular saat ini, tetapi mungkin primitif atau Objek dalam kontrol kustom Anda. Contoh yang baik, adalah<input file="type">
komponen, di mana viewValue berisiFileList
objek dengan file yang dilampirkan oleh pengguna. Dokumen Angular sedang bingung tentang hal ini sekarang dan harus diperbarui.Anda bisa melihat hal-hal seperti ini:
$modelValue
adalah API eksternal Anda, artinya, sesuatu yang diekspos ke pengontrol Anda.$viewValue
adalah API internal Anda, Anda harus menggunakannya hanya secara internal.Saat mengedit
$viewValue
, metode render tidak akan dipanggil, karena ini adalah "model yang dirender". Anda harus melakukannya secara manual, sedangkan metode rendering akan dipanggil secara otomatis setelah$modelValue
modifikasi.Namun, informasinya akan tetap konsisten berkat
$formatters
dan$parsers
:$viewValue
,$parsers
akan menerjemahkannya kembali ke$modelValue
.$modelValue
,$formatters
akan mengubahnya menjadi$viewValue
.sumber
$viewValue
melaluisetViewValue(viewValue)
metode, parser / validator menendang (jika ada) dan menguraikannyaviewValue
ke modelValue, memvalidasinya, menulisnya ke cakupan, lalu memulaiviewChangeListeners
. Saat digest berikutnya berjalan, nilai model diambil dari scope dan dibandingkan dengan $ modelValue di controller: github.com/angular/angular.js/blob/master/src/ng/directive/… . Jika mereka sama (dan mereka akan sama dalam skenario Anda), maka itu kembali.Angular harus melacak dua tampilan data ngModel- ada data seperti yang terlihat oleh DOM (browser) dan kemudian ada representasi diproses Angular dari nilai-nilai tersebut. Ini
$viewValue
adalah nilai sisi DOM. Jadi, misalnya, di<input>
file$viewValue
adalah apa yang pengguna mengetik di browser mereka.Setelah seseorang mengetik sesuatu
<input>
kemudian$viewValue
diproses oleh $ parsers dan diubah menjadi tampilan Angular dari nilai yang dipanggil$modelValue
.Jadi Anda dapat menganggap
$modelValue
sebagai versi nilai yang diproses sudut, nilai yang Anda lihat dalam model, while$viewValue
versi mentahnya.Untuk mengambil satu langkah lebih jauh, bayangkan kita melakukan sesuatu yang mengubah file
$modelValue
. Angular melihat perubahan ini dan memanggil $ formatters untuk membuat pembaruan$viewValue
(berdasarkan $ modelValue baru) untuk dikirim ke DOM.sumber