代码之家  ›  专栏  ›  技术社区  ›  B.T.

Appcelerator+Alloy+Eval循环对象-$将其打断

  •  -1
  • B.T.  · 技术社区  · 8 年前

    我在屏幕上有384个对象,我需要按特定顺序迭代,根据变化的变量改变它们的属性。下面是对象在中的外观。xml文件:

        <View formFactor="tablet" id="res1_1" class="resBit" left="1.5%" bottom="25.0%" />
        <View formFactor="tablet" id="res1_2" class="resBit" left="1.5%" bottom="27.3%" />
        <View formFactor="tablet" id="res1_3" class="resBit" left="1.5%" bottom="29.6%" />
        <View formFactor="tablet" id="res1_4" class="resBit" left="1.5%" bottom="31.9%" />
        [...]
        <View formFactor="tablet" id="res16_22" class="resBit" left="93.0%" bottom="73.3%" />
        <View formFactor="tablet" id="res16_23" class="resBit" left="93.0%" bottom="75.6%" />
        <View formFactor="tablet" id="res16_24" class="resBit" left="93.0%" bottom="77.9%" />
    

    // theValues rotates between a set of 100 or so such combinations
    theValues = "2,2,3,4,5,5,4,3,2,2,3,4,5,5,4,3".split(",");
    
    // Start on the left and move right
    for (i=1; i<17; i++) {
        // Start at the bottom and move up
        for (ii=1; ii<25; ii++) {
            if (ii < (theValues[i-1]) - 1) {
                // Make first row solid
                if (i == 1) { eval('$.res' + i + '_' + ii + '.setOpacity(1);'); }
                // Paint reds
                eval('$.res' + i + '_' + ii + '.setBackgroundColor("red");');
            }
        }
    }
    

    我得到的错误是:

    [ERROR] :  TiExceptionHandler: (main) [10567,152803] ----- Titanium Javascript Runtime Error -----
    [ERROR] :  TiExceptionHandler: (main) [0,152803] - In undefined:1,1
    [ERROR] :  TiExceptionHandler: (main) [0,152803] - Message: Uncaught ReferenceError: $ is not defined
    [ERROR] :  TiExceptionHandler: (main) [1,152804] - Source: $.res1_1.setOpacity(1);
    

    如果我只是写信 $.res1_1.setOpacity(1); 它直接在代码中工作。是评估打破了它。思想?谢谢

    1 回复  |  直到 8 年前
        1
  •  1
  •   Prashant Saini    8 年前

    除了那个错误之外,还有很多事情需要注意。

    第一件事是彻底检查你的用户界面结构。目前,如果您确实可以使用布局类型正确创建视图,则不建议手动设置左/下/上/右属性。

    从XML代码的外观来看,您似乎正在创建 16列x 25行 每个视图都有一个 左填充1.5%&顶部填充2.3%(这里您将其作为底部) 当前设计它的主要问题是手动使用左/下属性 当然 究竟为什么有人会手动创建384个视图:)

    现在,创建此类UI的推荐方法如下:

    样板xml

    <Alloy>
        <View class="resBit" left="1.5%" top="2.3%" />
    </Alloy>
    

    您的视图。xml

    <View id='parentContainer' formFactor="tablet" layout='horizontal' horizontalWrap='true' right='1.5%'>
        ..... here comes your those resBit views created dynamically
        // formFactor property is only set to parent container which also applies to its child container, so no need to set it on all 384 child views as you did
    
        // horizontalWrap property ensures that child-views which are going out of bound, will be created in
        // next row & thus it creates a grid-view automatically while using proper sizes so the last or
        // 16th view fits to the end of parent view.
    </View>
    

    您的视图。js公司

    // create child-views dynamically like this
    for (var i=1; i<=384; i++) {
        // you can pass any required arguments here needed to create child-views
        var templateView = Alloy.createController('template', {
            position : i
        }).getView();
    
        $.parentContainer.add(templateView);
    }
    

    var pos = $.args.position;
    
    // if it's the last or 16th child-view in each row, then set its width to fill the parent width, which will make sure that your next child-view will move to a new row.
    // it's necessary because sometimes while using %age dimensions, there might be a few pixels calculation error which can create the 16th child-view to next row
    
    if ((pos % 16) == 0) {
        $.template.width = Ti.UI.FILL;
    }
    

    最后 ,因为您没有res12\u 14等ID。您仍然可以像这样访问所有子视图:

    您的视图。js公司

    // theValues rotates between a set of 100 or so such combinations
    theValues = "2,2,3,4,5,5,4,3,2,2,3,4,5,5,4,3".split(",");
    
    // gives you all child-views in an array
    var child_views = $.parentContainer.children;
    
    // Start on the left and move right
    for (i=1; i<17; i++) {
    
        // Start at the bottom and move up
        for (ii=1; ii<25; ii++) {
            if (ii < (theValues[i-1]) - 1) {
                var currentChildPos = i * ii - 1;       // since we started loop from 1 & array index starts from 0
                // Make first row solid
                if (i == 1) {
                    child_views[currentChildPos].setOpacity(1);
                }
    
                // Paint reds
                child_views[currentChildPos].setBackgroundColor("red");
            }
        }
    }
    

    合金MVC框架 ,编写更少的代码,编写更多可维护的代码。如果您需要在这些resBit视图中进行任何更改,那么现在可以在中进行更改 样板xml 文件,而不是在您以前的代码中的384个位置。