escopo $ watch em uma diretiva não está sendo chamado após a requisição AJAX
Eu tenho a seguinte diretiva:
MyApp.directive('myFilter', ['$filter','$rootScope',
function($filter, $rootScope)
{
var dir = {};
dir.restrict = 'E';
dir.templateUrl = 'views/myFilter.html';
dir.replace = true;
dir.scope =
{
name: '@',
model: '=',
};
dir.link = function(scope,el,attrs)
{
//stuff here
}
return dir;
}]);
Aqui está como invoco:
<my-filter model="someField" name="abcd" />
Quando a diretiva é iniciada pela primeira vez, osomeField
está vazia. Mais tarde, ele é recuperado via ajax e seu valor é preenchido.
A pergunta é: como posso observar o valor desomeField
ser atualizado? Quando faço isso pelo método de link:
scope.$watch(scope.model, function()
{
console.log( "changed, new val: ", scope.model );
}
Isso é chamado apenas uma vez, ao iniciar a diretiva, e o valor fica vazio. Quando o valor é recuperado via ajax (de$http.get
), esta função de relógio não é chamada novamente. No entanto, em outras partes da página em que estou exibindo{{someField}}
, esse valor é atualizado quando o pedido ajax é buscado. Então eu não acho que o problema tenha a ver com fazer$scope.apply()
após o pedido de ajax.
Editar: someField
é atribuído no controlador. Aqui está o código:
MyApp.controller('myCtrl',
['$scope', '$rootScope', '$routeParams',
'ajax', '$filter',
function($scope, $rootScope, $routeParams, ajax, $filter)
{
var userId = parseInt( $routeParams.userId );
$scope.loaded = false;
$scope.someField = ""; //initalize with empty value
var load = function(data)
{
$scope.loaded = true;
$scope.someField = data.someField;
};
ajax.getUser(userId).success(load);
}
]);
O métodoajax.getUser()
faz um$http.get()
e retorna suapromise
. No código acima, oload
método é chamado que define o valor desomeField
.