Подтвердить что ты не робот

Манипулирование встроенным стилем с помощью angular не работает в IE

Я хотел установить положение div на основе возвращаемого значения функции в контроллере angular

В FireFox и в chrome работает отлично, но в Internet Explorer {{position($index)}}% интерпретируется как буквальное строковое значение и поэтому не имеет эффекта

<div ng-repeat="item in items" style="left:{{position($index)}}%"></div>

Вот пример проблемы:

var app = angular.module('app', []);

app.controller('controller', function($scope) {

    $scope.items=[1,2,3,4,5,6,7,8,9,10];

    $scope.position=function(i){
        var percent =[5,10,15,20,25,30,35,40,45,50,55,60,65,70];
        return percent[i+1];
    }
});

И вот Fiddle, чтобы продемонстрировать

Есть ли у кого-нибудь предложения по исправлению?

4b9b3361

Ответ 1

Вы должны использовать ng-style вместо стиля, в противном случае некоторые браузеры, такие как IE, удалят недопустимые значения атрибута стиля (наличие {{}} и т.д. делает его недействительным), прежде чем даже angular имеет возможность отобразить его. Когда вы используете ng-style angular, будет вычисляться выражение и добавлять к нему встроенные атрибуты стиля.

<div ng-repeat="item in items" ng-style="{left: position($index) + '%'}"></div>

Так как вы все равно вычисляете позицию, вы можете добавить % из position и отправить ее. Также помните, что вызов функции в ng-repeat вызовет функцию каждый цикл дайджеста, поэтому вы можете быть осторожны, чтобы не делать слишком интенсивных операций внутри метода.

 <div ng-repeat="item in items" ng-style="{left: position($index)}">{{item}}</div>

и верните

  return percent[i+1] + "%";

Демо-версия

Ответ 2

Если вы хотите использовать angular выражение привязки {{}} так же, как атрибут обычного стиля, например style="width:{{someScopeVar}}", используйте ng-attr-style, и он отлично подойдет IE (и, очевидно, другим умным):)

проверьте мои jsFiddle... Проверено с помощью angular JS 1.4.8

здесь я показал использование style, ng-style и ng-attr-style

HTML

<div ng-app="app">
    <div ng-controller="controller">

        <div style="background:{{bgColor}}">
            This will NOT get colored in IE
        </div>

        <div ng-attr-style="background:{{bgColor}}">
            But this WILL get colored in IE
        </div>

        <div ng-style="styleObject">
            And so is this... as this uses a json object and gives that to ng-style
        </div>

    </div>
</div>

JS

var app = angular.module('app', []);

app.controller('controller', function($scope) {

    $scope.bgColor = "yellow";        
    $scope.styleObject = {"background": "yellow"};
});

Ответ 3

Да, ng-style будет работать, чтобы решить эту проблему. Вы можете использовать условный стиль, используя ternary operator.

HTML:

<div ng-style="{'display':showInfo?'block':'none'}">
</div>