Sto provando a scrivere una direttiva che faccia uso dell'ambito isolato e della direttiva ngModel.Direttiva con campo di misura isolato e modello ng
Problema:
Quando il modello viene aggiornato nella direttiva, il valore del chiamante non viene aggiornato.
HTML:
<test-ng-model ng-model="model" name="myel"></test-ng-model>
direttiva:
app.directive(
'testNgModel', [
'$timeout',
'$log',
function ($timeout, $log) {
function link($scope, $element, attrs, ctrl) {
var counter1 = 0, counter2 = 0;
ctrl.$render = function() {
$element.find('.result').text(JSON.stringify(ctrl.$viewValue))
}
$element.find('.one').click(function() {
if ($scope.$$phase) return;
$scope.$apply(function() {
var form = angular.isObject(ctrl.$viewValue) ? ctrl.$viewValue : {};
form.counter1 = ++counter1;
ctrl.$setViewValue(form);
});
});
$element.find('.two').click(function() {
if ($scope.$$phase) return;
$scope.$apply(function() {
var form = angular.isObject(ctrl.$viewValue) ? ctrl.$viewValue : {};
form.counter2 = ++counter2;
ctrl.$setViewValue(form);
});
});
$scope.$watch(attrs.ngModel, function (current, old) {
ctrl.$render()
}, true)
}
return {
require: 'ngModel',
restrict: 'E',
link: link,
//if isolated scope is not set it is working fine
scope: true,
template: '<div><input type="button" class="one" value="One"/><input type="button" class="two" value="Two"/><span class="result"></span></div>',
replace: true
};
}]);
Demo: Fiddle
Se l'ambito isolato non è impostato funziona bene: fiddle
'ambito: true' non crea un ambito isolato, si crea un nuovo ambito figlio che eredita prototipicamente dal campo di applicazione genitore, da qui il motivo '$ parent.model' funziona. (Un ambito isolato viene creato quando usiamo la sintassi 'scope: {...}' Qui viene anche creato un nuovo ambito figlio, ma esso non eredita prototipicamente dal genitore.) In generale, un ambito figlio dovrebbe essere utilizzato con ng-model poiché si sta creando un componente che deve interagire con altre direttive (ad esempio, ng-model). Quindi ti suggerisco di andare con il tuo secondo, funzionante, violino. –
@MarkRajcok che non è un'opzione per me dal momento che la direttiva è più complessa e aggiunge alcuni attributi personalizzati all'ambito che porteranno all'inquinamento dello scope genitore –
Ok, usa 'scope: true', ma usa anche un oggetto, non un primitivo: ''. [Violino] (http://jsfiddle.net/mrajcok/6ZaB5/). –