Подтвердить что ты не робот

Scope. $watch в директиве не вызывается после запроса AJAX

У меня есть следующая директива:

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; 
}]);

Вот как я его вызываю:

<my-filter model="someField" name="abcd" />

Когда директива сначала инициализируется, someField пуст. Позже он извлекается через ajax, и его значение заполняется.

Вопрос: как я могу следить за обновлением значения someField? Когда я делаю это по методу ссылок:

scope.$watch(scope.model, function()
{
   console.log( "changed, new val: ", scope.model );
}

Это вызывается только один раз, когда инициализирует директиву, а значение затем пусто. Когда значение извлекается через ajax (от $http.get), эта функция часов не вызывается снова. Однако в других частях страницы, где я показываю {{someField}}, это значение обновляется, когда вызывается запрос ajax. Поэтому я не думаю, что проблема связана с выполнением $scope.apply() после запроса ajax.

Изменить: someField назначается в контроллере. Вот код:

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);               
}
]);

Метод ajax.getUser() делает a $http.get() и возвращает его promise. В приведенном выше коде вызывается метод load, который устанавливает значение someField.

4b9b3361

Ответ 1

$watch ожидает выражение, которое может быть либо функцией, либо строкой. Таким образом, он будет работать, если вы измените его на

scope.$watch('model', function() { ... });

или

scope.$watch(function() { return scope.model; }, function() { ... });

Отметьте этот jsFiddle.