2013-08-09 7 views
39

Ho la seguente direttiva:

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

Ecco come l'invocarlo:

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

Quando la direttiva è prima initalized , lo someField è vuoto. Più tardi, viene recuperato tramite ajax e il suo valore viene compilato.

La domanda è: come è possibile aggiornare il valore di someField? Quando faccio questo dal metodo link:

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

Questo è chiamato solo una volta, quando Inizializzare la direttiva, e quindi il valore è vuoto. Quando il valore viene recuperato tramite ajax (da $http.get), questa funzione orologio non viene richiamata. Tuttavia, in altre parti della pagina in cui sto visualizzando {{someField}}, tale valore viene aggiornato quando viene recuperata una richiesta jax. Quindi non penso che il problema abbia a che fare con lo fare $scope.apply() dopo una richiesta di jax.

Modifica:someField è assegnato nel controller. Ecco il codice:

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

Il metodo ajax.getUser() fa un $http.get() e restituisce la sua promise. Nel codice sopra, viene chiamato il metodo load che imposta il valore di someField.

+0

Mostraci come è definito un campo e come viene assegnato il valore recuperato –

+0

@YeLiu Aggiunta una modifica –

risposta

92

$watch prevede un'espressione che può essere una funzione o una stringa. Così, funzionerà se si cambia a

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

o

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

Partenza this jsFiddle.

+23

Credo che SO sia il posto migliore per discutere di cose come questa, piccole o meno. Puoi scegliere il cervello di tutti, non solo il mio. :) –

+2

È vero, ma le domande di AngularJS richiedono spesso molto tempo per ottenere una risposta su SO. –

+20

@ClickUpvote: lo scopo di un sistema come SO è di beneficiare dell'intera comunità. Stai chiedendo a Michael di essere il tuo consulente privato. Tornando ai giorni di Usenet, non abbiamo risposto per email per questo motivo. –

Problemi correlati