programing

지시문의 scope.$watch가 AJAX 요청 후에 호출되지 않았습니다.

bestprogram 2023. 2. 26. 16:27

지시문의 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를 통해 검색되고 값이 입력됩니다.

문제는, 어떻게 하면 IT부문의 가치를 지켜볼 수 있는가 하는 것입니다.someField갱신할 것인가?링크 방식에서 이 작업을 수행할 경우:

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

이것은 디렉티브를 초기화할 때 한 번만 호출되며 값은 비어 있습니다.값이 ajax를 통해 검색되는 경우(from)$http.get이 워치 기능은 다시 호출되지 않습니다.다만, 이 페이지의 다른 부분에서는,{{someField}}, 이 값은 Ajax 요구가 Import 되었을 때 갱신됩니다.그래서 저는 이 문제가 이 일과 관련이 없는 것 같아요.$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()을 하다$http.get()반환한다.promise위의 코드에서는loadmethod가 호출되어 값이 설정됩니다.someField.

$watch는 함수 또는 문자열 중 하나를 사용할 수 있는 식을 요구합니다.그래서 이렇게 바꾸면 될 것 같아요.

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

또는

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

jsFiddle을 보세요.

언급URL : https://stackoverflow.com/questions/18139375/scope-watch-in-a-directive-isnt-being-called-after-ajax-request