2014-11-04 28 views
0

是否可以從mixin中更新sass映射中的值,以便全局保存更改?從mixin中創建一個sass映射值 - 全局保存

$obj: (
    init: false 
) 

@mixin set($map) { 

@if map-get($obj, init) != true { 
    // mixin hasn't been called before 
    $map: map-set($map, init, true); 
} 
@else { 
    // mixin has been called before 
} 

} 

.test { 
@include set($obj); 
// sets the init value to true 
} 

.test-2 { 
@include set($obj); 
// init value has already been set to true 
} 

回答

0

我不知道如果我明白你正在嘗試做的,但你的代碼似乎是罰款(沒有測試它雖然),除此之外,沒有MAP-設置功能,但您可以創建一個或僅使用地圖合併(請點擊此處:http://oddbird.net/2013/10/19/map-merge/)。我希望有所幫助。

@update 1:我想我現在得到了你的問題,你想通過mixin傳遞參考,所以如果你有多個地圖,你可以發送一個你想要更新的混合,我不會「T認爲這是可能的,但因爲沒有參考保持,如果你需要更新你必須直接鏈接到它,因爲爲例變量,此作品(測試):

$obj: (
    init: false 
); 

@mixin set($map) { 

    @if map_get($map, init) != true { 
    $obj: map-set($map, init, true) !global; 
    body { 
     background-color: #000; 
    } 
    } @else { 
    body { 
     background-color: #ff0000; 
    } 
    } 
} 


@include set($obj); 
@include set($obj); 

但是如果你參考$ map而不是$ obj (in this line $obj: map-set($map, init, true) !global;),那麼將會創建一個新的全局地圖(稱爲$ map)。每次你再次調用mixin時,它將被你作爲參數發送的地圖所取代。

@Update 2:我找到了一種方法來做到這一點,但你必須保持全球「的地圖地圖」,並且每次更新這個人的時候,你發送你想更新地圖的名稱作爲參數,所以我想出了下面的代碼,它的測試和精細的工作:)

@function map-set($map, $key, $value) { 
    $new: ($key: $value); 
    @return map-merge($map, $new); 
} 

$maps: (
    obj1: (
    init: false 
), 

    obj2: (
    init: false 
), 
); 

@mixin set($prop) { 

    @if map_get(map_get($maps, $prop), init) != true { 
    $obj: map-set(map_get($maps, $prop), init, true); 

    $maps: map-set($maps, $prop, $obj) !global; 

    body { 
     background-color: #000; 
    } 
    } @else { 
    body { 
     background-color: #ff0000; 
    } 
    } 
} 

@include set(obj1); //black 
@include set(obj2); //black 

@include set(obj1); //red 
@include set(obj2); //red 

來源:自己

+0

這就是爲什麼我所需的功能,http://sassmeister.com/gist/8b135117ebcee187c62d – magicspon 2014-11-04 23:48:17

0

從@Paulo繼穆尼奧斯

下面是解

@function map-set($map, $key, $value) { 
    $new: ($key: $value); 
    @return map-merge($map, $new); 
} 

$extend :(); 

$obj : (
margin: 0, 
padding: 10 
); 

@mixin set($map, $name) { 

    @if map-has-key($extend, $name) { 

    map: has-key; 

    // call placeholder class 

    } @else { 

    $extend: map-set($extend, $name, true) !global; 

    map: does-not-have-key; 
    // create placeholder class 
    // call placeholder class 


    } 

} 

.test { 
    @include set($obj, test); 
} 

.test-2 { 
    @include set($obj, test); 
} 

產生

.test { 
    map: does-not-have-key; 
} 

.test-2 { 
    map: has-key; 
}