39

次のディレクティブがあります。

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

これは、ディレクティブを初期化するときに 1 回だけ呼び出され、値は空になります。値が (から) ajax を介して取得される場合$http.get、このウォッチ関数は再度呼び出されません。ただし、表示しているページの他の部分では、{{someField}}ajax リクエストがフェッチされると、その値は更新されます。$scope.apply()したがって、問題はajaxリクエストの後に行うことに関係しているとは思いません。

Edit: 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

4

1 に答える 1

92

$watch関数または文字列のいずれかの式が必要です。したがって、次のように変更すると機能します

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

また

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

この jsFiddleをチェックしてください。

于 2013-08-09T03:24:03.263 に答える