Eu tenho a seguinte diretiva ckEditor. Na parte inferior, estão duas variações que vi nos exemplos de como definir os dados no 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);
};
}
};
}])
Alguém pode me dizer qual é a diferença entre:
ck.setData(ngModel.$modelValue);
ck.setData(ngModel.$viewValue);
E qual devo usar. Eu olhei a documentação angular e dizia:
$viewValue
Actual string value in the view.
$modelValue
The value in the model, that the control is bound to.
Não tenho ideia do que o autor quis dizer quando escreveu isso no documento :-(
$viewValue
é sempre uma string?$viewValue: Actual string value in the view.
. Então sim.<input type="text">
valor está vazio, a$modelValue
propriedade éundefined
, enquanto o$viewValue
é uma''
string vazia. Isso pode fazer diferença se você estiver farejando o "comprimento" do$modelValue
que não funcionará, mas$viewValue
funcionará.$viewValue
nem sempre é uma string. É uma string para as diretivas principais Angular atuais, mas pode ser uma primitiva ou um objeto em seus controles personalizados. Um bom exemplo é o<input file="type">
componente, onde viewValue contém oFileList
objeto com arquivos anexados pelo usuário. Os documentos do Angular são confusos sobre isso agora e devem ser atualizados.Você pode ver coisas assim:
$modelValue
é a sua API externa, ou seja, algo exposto ao seu controlador.$viewValue
é sua API interna, você deve usá-la apenas internamente.Ao editar
$viewValue
, o método de renderização não será chamado, pois é o "modelo renderizado". Você terá que fazer isso manualmente, enquanto o método de renderização será chamado automaticamente após as$modelValue
modificações.No entanto, as informações permanecerão consistentes, graças a
$formatters
e$parsers
:$viewValue
,$parsers
o traduzirá de volta para$modelValue
.$modelValue
,$formatters
o converterá em$viewValue
.fonte
$viewValue
por meio dosetViewValue(viewValue)
método, os analisadores / validadoresviewValue
iniciam (se houver) e analisam isso no modelValue, validam, gravam no escopo e depois executam o kickviewChangeListeners
. Na próxima vez que o resumo for executado, o valor do modelo será recuperado do escopo e comparado ao $ modelValue no controlador: github.com/angular/angular.js/blob/master/src/ng/directive/… . Se eles forem iguais (e serão iguais no seu cenário), ele retorna.O Angular precisa manter o controle de duas visualizações dos dados do ngModel - há os dados conforme vistos pelo DOM (navegador) e, em seguida, há a representação processada do Angular desses valores. O
$viewValue
é o valor do lado DOM. Assim, por exemplo, em uma<input>
o$viewValue
é o que o usuário digitou no seu browser.Uma vez que alguém digita algo
<input>
,$viewValue
é processado por $ parsers e transformado na visão do Angular do valor que é chamado$modelValue
.Portanto, você pode pensar em
$modelValue
ser a versão processada do valor do angular, o valor que você vê no modelo, enquanto$viewValue
é a versão bruta.Para dar um passo adiante, imagine que fazemos algo que muda o
$modelValue
. Angular vê essa mudança e chama $ formatters para criar um valor atualizado$viewValue
(baseado no novo $ modelValue) a ser enviado ao DOM.fonte