scope. $ watch w dyrektywie nie jest wywoływany po żądaniu AJAX
Mam następującą dyrektywę:
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;
}]);
Oto, jak go wywołam:
<my-filter model="someField" name="abcd" />
Po pierwszej inicjalizacji dyrektywysomeField
jest pusty. Później jest pobierany przez ajax, a jego wartość jest wypełniana.
Pytanie brzmi, jak mogę sprawdzić wartośćsomeField
do zaktualizowania? Kiedy to robię z metody linku:
scope.$watch(scope.model, function()
{
console.log( "changed, new val: ", scope.model );
}
Jest to wywoływane tylko raz, podczas inicjowania dyrektywy, a wartość jest wtedy pusta. Po pobraniu wartości za pomocą ajax (z$http.get
), ta funkcja zegarka nie zostanie ponownie wywołana. Jednak w innych częściach strony, na których wyświetlam{{someField}}
, ta wartość NIE aktualizuje się, gdy pobierane jest żądanie ajax. Więc nie sądzę, aby problem miał związek z robieniem$scope.apply()
po żądaniu ajax.
Edytować: someField
jest przypisany w kontrolerze. Oto kod:
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);
}
]);
Metodaajax.getUser()
robi a$http.get()
i zwraca jegopromise
. W powyższym kodzieload
wywoływana jest metoda, która ustawia wartośćsomeField
.