2013-03-12 20 views
14

Tôi có một file có tên style.scss với đoạn mã sau:Sass bỏ qua các biến, quy định tại if-tuyên bố

@import 'variables'; 

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

Và một phần tên _variables.scss:

$colorscheme: white; 

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

Các if- tuyên bố hoạt động đúng, nhưng các biến được xác định bên trong, không hoạt động. Khi tôi cố gắng biên dịch, tôi tiếp tục nhận được:

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

+0

Tôi bước vào cùng một điều thực sự. Tôi đã tự hỏi rằng mã sass của tôi đã không hoạt động sau một vài tháng. Nhận thấy rằng tôi đã cập nhật phiên bản grunt-sass (node-sass/libsass). Tôi chắc chắn 100% xác định các biến bên trong '@ if/@ else' đã hoạt động tại thời điểm đó. Tôi đã chơi rất nhiều với điều đó. Có lẽ đó là một lỗi và nó không nên có tác dụng. : D Cảm ơn bạn đã làm rõ điều này, @cimmanon. – monospace

Trả lời

27

Điều đó hoàn toàn được mong đợi. Các biến có phạm vi cho chúng. Nếu bạn xác định chúng bên trong một khối điều khiển (như một câu lệnh if), thì chúng sẽ không có sẵn bên ngoài. Vì vậy, những gì bạn cần làm là khởi tạo nó ở bên ngoài như vậy:

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

Hoặc ...

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

Mặc dù nó sẽ ít tiết để sử dụng chức năng if() như thế này:

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

Cảm ơn, đã giải quyết nó. Vì vậy, nó hoạt động khá giống với các biến trong hàm PHP. Tôi không thích tạo biến trống, nhưng điều đó thực hiện lừa. Có lệnh nào, bằng lệnh _global_ từ PHP không? Tôi cảm thấy thoải mái hơn một chút. Tôi đã thử ví dụ cuối cùng của bạn và nó đã hoạt động, nhưng tôi chưa bao giờ thấy bất kỳ câu lệnh if nào được viết như thế. Và tôi đã không tìm thấy nó trong tài liệu SASS. Bạn có thể cho tôi thêm nguồn cho nó không? – Afterlame

+0

Tôi đoán bạn có thể nghĩ về phạm vi theo cách đó. PHP như một ngôn ngữ không có phạm vi thích hợp như các ngôn ngữ khác. Sass không có từ khóa * global *, bất cứ thứ gì được khai báo bên ngoài dấu ngoặc nhọn đều có thể truy cập bên trong. Hàm 'if' (không bị nhầm lẫn với khối điều khiển' @ if') ở đây: http://sass-lang.com/docs/yardoc/Sass/Script/Functions.html#if-instance_method – cimmanon

+2

Cuối cùng là tự động -ghi đè trong câu trả lời này sẽ ngừng hoạt động! SASS bây giờ muốn bạn chắp thêm '! Global' vào giá trị khi bạn ghi đè một var toàn cục trong phạm vi khối. Nếu không, nó sẽ bắt đầu biến chúng thành các vars cục bộ. –

5

Mặc dù ví dụ này thậm chí còn là nhiều chi tiết hơn tiết, nó giúp loại bỏ sự cần thiết phải đặt hai biến trống:

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

Ví dụ thứ 2 và thứ 3 của @ cimmanon tốt hơn nhiều.

Các vấn đề liên quan