2013-05-11 7 views
17

Come si imposta il valore interpolato in una direttiva? Posso leggere il valore corretto dal seguente codice, ma non sono stato in grado di impostarlo.come impostare un valore interpolato nella direttiva angolare?

JS:

app.directive('ngMyDirective', function() { 
    return function(scope, element, attrs) { 
     console.log(scope.$eval(attrs.ngMyDirective)); 

     //set the interpolated attrs.ngMyDirective value somehow!!! 
    } 
}); 

html:

<div ng-my-directive="myscopevalue"></div> 

dove myscopevalue è un valore sul campo di applicazione del mio controller.

risposta

24

Se si desidera impostare un valore sul campo di applicazione, ma non si conosce il nome della proprietà (in anticipo), è possibile utilizzare la sintassi object[property]:

scope[attrs.myNgDirective] = 'newValue'; 

Se la stringa in l'attributo contiene un punto (es. myObject.myProperty), questo non funzionerà; è possibile utilizzare $eval per fare un incarico:

// like calling "myscopevalue = 'newValue'" 
scope.$eval(attrs.myNgDirective + " = 'newValue'"); 

[Aggiornamento: Si dovrebbe davvero usare $parse invece di $eval. . Vedere Mark's answer]

Se stai usando un ambito isolato, è possibile utilizzare il = della nota:

app.directive('ngMyDirective', function() { 
    return { 
     scope: { 
      theValue: '=ngMyDirective' 
     }, 
     link: function(scope, element, attrs) { 
      // will automatically change parent scope value 
      // associated by the variable name given to `attrs.ngMyDirective` 
      scope.theValue = 'newValue'; 
     } 
    } 
}); 

Si può vedere un esempio di questo in this Angular/jQuery color picker JSFiddle example, dove assegnando a scope.color all'interno della direttiva aggiorna automaticamente la variabile ha superato in la direttiva sull'ambito del controller.

+0

scope [attrs.myNgDirective] = 'newValue'; lavorato! sebbene il valore di myNgDirective debba essere direttamente sull'oscilloscopio, non un sottooggetto dell'oscilloscopio. che ha senso – Anton

+0

Credo che dovresti essere in grado di '$ eval' con un'espressione di assegnazione per la notazione dell'oggetto; Aggiornerò la mia risposta –

+0

sarebbe bello. qualcosa come scope. $ eval (attrs.ngMyDirective = 'nuovo valore')? – Anton

45

Ogniqualvolta una direttiva non utilizza un ambito isolato e si specifica una proprietà dell'ambito utilizzando un attributo e si desidera modificare il valore di tale proprietà, suggerisco di utilizzare $parse. (Penso che la sintassi è più bello di $ eval di.)

app.directive('ngMyDirective', function ($parse) { 
    return function(scope, element, attrs) { 
     var model = $parse(attrs.ngMyDirective); 
     console.log(model(scope)); 
     model.assign(scope,'Anton'); 
     console.log(model(scope)); 
    } 
}); 

fiddle

$parse opere se l'attributo contiene un punto.

+0

roba interessante. Grazie per la risposta. Potresti avere un punto che analizza potrebbe essere un termine/sintassi migliore da usare rispetto a eval.evviva – Anton

+3

Questo è sicuramente il modo giusto per implementare '=' senza l'isolamento dello scope. –

+0

Ho dovuto aggiungere un 'scope. $ Apply()' dopo 'model.assign (...)' per fare in modo che la modifica della mia direttiva si riflettesse nella vista. C'è una soluzione più pulita? – Juljan