У меня есть следующая директива ckEditor. Внизу два варианта, которые я видел на примерах того, как установить данные в редакторе:
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);
};
}
};
}])
Может кто-нибудь сказать мне, в чем разница между:
ck.setData(ngModel.$modelValue);
ck.setData(ngModel.$viewValue);
И что я должен использовать. Я посмотрел документацию angular, и там написано:
$viewValue
Actual string value in the view.
$modelValue
The value in the model, that the control is bound to.
Понятия не имею, что имел в виду автор, когда писал это в документе :-(
$viewValue
всегда ли это строка?$viewValue: Actual string value in the view.
. Так да.<input type="text">
значение пусто, то$modelValue
свойствоundefined
, в то время как$viewValue
это''
пустая строка. Это может иметь значение, если вы нюхаете «длину»,$modelValue
которая не сработает, но$viewValue
будет.$viewValue
Не всегда является строкой. Это строка для текущих директив ядра Angular, но это может быть примитив или объект в ваших пользовательских элементах управления. Хорошим примером является<input file="type">
компонент, в котором viewValue содержитFileList
объект с прикрепленными пользователем файлами. Документы по Angular сейчас сбивают с толку и должны быть обновлены.Вы можете увидеть такие вещи:
$modelValue
это ваш внешний API, то есть что-то, доступное вашему контроллеру.$viewValue
это ваш внутренний API, вы должны использовать его только внутри.При редактировании
$viewValue
метод рендеринга не вызывается, потому что это «рендеринговая модель». Вам придется делать это вручную, тогда как метод рендеринга будет вызываться автоматически при$modelValue
внесении изменений.Тем не менее, информация будет оставаться последовательной, благодаря
$formatters
и$parsers
:$viewValue
,$parsers
переведу обратно на$modelValue
.$modelValue
,$formatters
преобразует его в$viewValue
.источник
$viewValue
помощьюsetViewValue(viewValue)
метода включаются парсеры / валидаторы (если есть) и анализируют этоviewValue
значение в modelValue, проверяют его, записывают в область видимости и затем запускаютviewChangeListeners
. При следующем запуске дайджеста значение модели извлекается из области видимости и сравнивается с $ modelValue в контроллере: github.com/angular/angular.js/blob/master/src/ng/directive/… . Если они равны (а в вашем сценарии они будут равны), то он вернется.Angular должен отслеживать два представления данных ngModel - это данные, которые видит DOM (браузер), а затем обработанное представление этих значений Angular. Это
$viewValue
значение стороны DOM. Так, например, в теге<input>
-$viewValue
это то, что пользователь ввел в свой браузер.После того, как кто - то типы что - то в
<input>
то$viewValue
обрабатываются $ анализаторов и превратился в поле зрения ANGULAR о стоимости , которая называется$modelValue
.Таким образом, вы можете представить
$modelValue
себя обработанной версией значения angular, значением, которое вы видите в модели, а$viewValue
это необработанная версия.Чтобы сделать еще один шаг вперед, представьте, что мы делаем что-то, что меняет файл
$modelValue
. Angular видит это изменение и вызывает $ formatters для создания обновленного$viewValue
(на основе нового $ modelValue) для отправки в DOM.источник