【问题标题】:angular ng-repeat add style on conditionangular ng-repeat 根据条件添加样式
【发布时间】:2013-09-04 05:46:40
【问题描述】:

我在 div 列表上使用 ng-repeat,并且我在 json 中手动添加项目以呈现此 div。我需要定位我在 json 中添加的最后一个 div,它会自动在屏幕上渲染,光标所在的位置,其余部分保持在同一位置,但没有给出渲染它的 json 中的位置。

我的方法是这样的

<div ng-repeat="contact in jsonContacts" style="left: {{lastX}}px; top: {{lastY}}px;"></div>

但是当我这样做时,所有的 div 都会得到这个位置,所以我需要使用 $last 变量来添加或删除带有左侧和顶部 css 的样式标签。

提前谢谢你,丹尼尔!

【问题讨论】:

    标签: javascript jquery html css angularjs


    【解决方案1】:

    根据你的html,你应该试试这个

    <div ng-repeat='contact in jsonContacts' ng-style='{"left":($last?lastX:null)+"px","top":($last?lastY:null)+"px"}'>{{item}}</div>
    

    这是确认http://jsfiddle.net/cmyworld/yFc6J/1/的小提琴

    【讨论】:

    • 我以为你是can't use conditional logic in expressions,所以这行不通?
    • @AndyBrown 实际上,至少在 1.5.1 中看到我更新的小提琴。
    • 你说得对,我在评论中没有空间谈论版本。有关信息,请参阅我的答案。我确实假设使用当前稳定的 1.0.x 分支来解决 SO 问题,除非 OP 另有说明。
    • 只有将 style="position:absolute" 添加到重复元素并将 "position:relative" 添加到它们的父 div 后,小提琴才会起作用。
    【解决方案2】:

    有关这两种方法的示例,请参阅此 fiddle(在 jsfiddle 中使用颜色作为位置更难)

    选项 1:ng 样式和范围函数

    ng-style 会让你这样做,为了保持整洁和可测试,你应该定义一个范围函数,如下所示(三元运算符是 not currently supported 在角度表达式中用于稳定的 1.0.x 版本的角度,although 1.1.5 has added ternary support )。

    ng-style='myStyleFunction($last)'
    

    在控制器中,定义:

    $scope.myStyleFunction = function($last) {
      return {
        'left': $last ? $scope.lastX + 'px' : '',
        'top': $last ? $scope.lastY + 'px' : ''
      };
    }
    

    选项 2:自定义指令

    或者,您可以考虑更多“角度”并定义一个指令:

    dirModule.directive('positionLast', function() {
        return {
            scope: true,
            link: function (scope, $element, attrs) {
                if (scope.$last) {
                  // if jQuery is present use this, else adjust as appropriate
                  $element.css("left", $scope.lastX + 'px');
                  $element.css("top", $scope.lastY + 'px');
                }
            }
        }
    });
    

    然后:

    <div ng-repeat="contact in jsonContacts" position-last> ...
    

    EDIT 这通过使用scope: true 并在ng-repeat 元素上声明指令来工作。由于只为元素上的所有指令创建了一个新范围(假设至少有一个请求新范围),因此它可以访问ng-repeat scope values。相关文档见:

    scope - 如果设置为 true,将为该指令创建一个新的范围。如果同一元素上的多个指令请求一个新范围,则只会创建一个新范围。

    【讨论】:

    • 每次我问一些问题,从答案中我明白 Angular 比我以前强硬的更强大和复杂 :D 非常感谢你,我也会尝试看看指令中的范围是如何工作的来自 ng-repeat 的 $last :)
    猜你喜欢
    • 1970-01-01
    • 2015-10-19
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-02-16
    • 2016-03-24
    相关资源
    最近更新 更多