减少混合范围问题

时间:2014-09-02 22:10:14

标签: css less frontend mixins

我构建了一个参数化mixin,它根据" node-value"来查找元素的子元素。我创建的系统。会发生什么是通过循环函数找到子项" .extractArrays"与" .deliverChild"在里面。然后将子项(最多4个)放入" .calculateWidth",它返回变量中子项的宽度(例如" calculatedWidth1")。

问题是:当没有第三个和第四个孩子时,@ child3和@ child4未设置,这会产生错误。我在mixins之前将@ child3和@ child4设置为零,希望在调用mixins之前这会给它们默认值0。但是,出于某种原因,当有第三个孩子时,mixin的返回值@ child3不会覆盖设置为0的@ child3。我不确定为什么会这样,但我觉得比如在混合和范围方面有一些事情让我想起Less。

@child3: none, 0 0, 0, 0;
@child4: none, 0 0, 0, 0;

    .extractArrays(@index, @node, @node-value, @elements-array) when (@index <= @length-elements-array) {
        @element-array: extract(@elements-array, @index);
        @found-node: extract(@element-array, 2);
        .deliverChild(@element-array, @found-node) when (@found-node = @child-node-value1) {
            @child1: extract(@element-array, 1);
        }
        .deliverChild(@element-array, @found-node) when (@found-node = @child-node-value2) {
            @child2: extract(@element-array, 1);
        }
        .deliverChild(@element-array, @found-node) when (@found-node = @child-node-value3) {
            @child3: extract(@element-array, 1);
        }
        .deliverChild(@element-array, @found-node) when (@found-node = @child-node-value4) {
            @child4: extract(@element-array, 1);
        }
        .deliverChild(@element-array, @found-node);
        .extractArrays(@index + 1, @node, @node-value, @elements-array);
    }
    .extractArrays(1, @node, @node-value, @elements-array);


    .calculateWidth(@child1, 1);
    .calculateWidth(@child2, 2);
    .calculateWidth(@child3, 3);

    width: @calculatedWidth1 + @calculatedWidth2 + @calculatedWidth3 + @calculatedWidth4;

1 个答案:

答案 0 :(得分:0)

(不完全回答&#34;范围&#34;上面的问题,但是在上面的评论中建议的另一种方法中使用的算法作为起点):

通用数组过滤mixin看起来像这样(小于1.7.5或更高):

@array: // key value
    a 1,
    b 2,
    c 3,
    a 4,
    d 5,
    a 6,
    c 7;

// usage:
usage {
   .filter-array(@array, a); 
    result: @filter-array;
}

// impl.:
.filter-array(@array, @key, @key-index: 1) {
    .-(length(@array));
    .-(@i, @r...) when (@i > 0)
        and not(@key = extract(extract(@array, @i), @key-index)) {
            // skip item since key does not match
            .-((@i - 1), @r);
    }
    .-(@i, @r...) when (length(@r) > 0)
        and (@key = extract(extract(@array, @i), @key-index)) {
            // key matches and @r is not empty so concat current item to @r
            .-((@i - 1); extract(@array, @i), @r);
    }
    .-(@i, @r...) when (length(@r) = 0)
        and (@key = extract(extract(@array, @i), @key-index)) {
            // key matches and @r is empty so this is our first item
            .-((@i - 1), extract(@array, @i));
    }
    .-(@i, @r...) when (@i = 0) {
        // define "return" variable:
        @filter-array: @r;
    }
}

结果数组等于:

@filter-array:
    a 1,
    a 4,
    a 6;

这看起来非常可怕和冗长,但仍然比原始方法更干净,更可控。

此外,提供专用的mixin以返回数组项的某些值的总和(或任何其他&#34;转换&#34;结果为单个值)是有意义的(这样的实现可以是简化到某一点,因为你不需要连接任何东西,上面的一些条件和/或mixin专业化变得不必要了。)