2013-03-12 12 views
14

Ho un file chiamato style.scss con il seguente codice:SASS ignora le variabili, definite in se-dichiarazione

@import 'variables'; 

body { 
    color: $text-color; 
    background: $background-color; 
} 

E un parziale di nome _variables.scss:

$colorscheme: white; 

@if $colorscheme == white { 
    $text-color: #333; 
    $background-color: #fff; 
} 
@else { 
    $text-color: #ccc; 
    $background-color: #333; 
} 

Il se- la dichiarazione funziona correttamente, ma le variabili definite all'interno non funzionano. Quando provo a compilarlo, continuo a ricevere:

Syntax error: Undefined variable: “$text-color”.

+0

Sono entrato nella stessa cosa in realtà. Mi stavo chiedendo che il mio codice di sass non ha funzionato dopo pochi mesi. Notato, che ho aggiornato la mia versione grunt-sass (node-sass/libsass). Sono sicuro al 100% che la definizione delle variabili all'interno di '@ if/@ else' funzionasse in quel momento. Ho giocato molto con questo. Forse era un bug e non avrebbe dovuto funzionare. : D Grazie per aver chiarito questo aspetto, @cimmanon. – monospace

risposta

27

che è completamente previsto. Le variabili hanno uno scope. Se li definisci all'interno di un blocco di controllo (come una dichiarazione if), non saranno disponibili all'esterno. Allora, che cosa dovete fare è inizializzare fuori in questo modo:

$text-color: null; 
$background-color: null; 
@if $colorscheme == white { 
    $text-color: #333; 
    $background-color: #fff; 
} 
@else { 
    $text-color: #ccc; 
    $background-color: #333; 
} 

Oppure ...

$text-color: #ccc; 
$background-color: #333; 
@if $colorscheme == white { 
    $text-color: #333; 
    $background-color: #fff; 
} 

Anche se sarebbe meno prolissa di utilizzare la funzione di if() in questo modo:

$text-color: if($colorscheme == white, #333, #ccc); 
$background-color: if($colorscheme == white, #fff, #333); 
+0

Grazie, questo lo ha risolto. Quindi si comporta in modo simile alle variabili nelle funzioni PHP. Non mi piace creare variabili vuote, ma questo è il trucco. C'è qualche comando, uguale al comando _global_ da PHP? Mi sentirò un po 'più a mio agio. Ho provato il tuo ultimo esempio e ha funzionato, ma non ho mai visto nessuna istruzione if scritta così. E non l'ho trovato nella documentazione SASS. Potresti darmi ulteriori fonti per questo? – Afterlame

+0

Immagino che tu possa pensare allo scoping in questo modo. PHP come lingua non ha scopeing adeguato come fanno gli altri linguaggi. Sass non ha una parola chiave * globale *, qualsiasi cosa dichiarata al di fuori delle parentesi graffe è accessibile all'interno. La funzione 'if' (da non confondere con i blocchi di controllo' @ if') è qui: http://sass-lang.com/docs/yardoc/Sass/Script/Functions.html#if-instance_method – cimmanon

+2

Alla fine l'auto -override in questa risposta smetterà di funzionare! SASS ora vuole che tu aggiunga '! Global' al valore quando stai sovrascrivendo una var globale in ambito di blocco. Altrimenti comincerà a renderli vars locali. –

5

Mentre questo esempio è anche altro verbose, elimina la necessità di impostare due variabili vuote:

@if $colorscheme == white { 
    $text-color: #333 !global; 
    $background-color: #fff !global; 
} @else { 
    $text-color: #ccc !global; 
    $background-color: #333 !global; 
} 

@ cimmanon 2 e 3 esempi sono molto meglio, però.

Problemi correlati