Манипулирование встроенным стилем с помощью 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, чтобы продемонстрировать
Есть ли у кого-нибудь предложения по исправлению?
Ответы
Ответ 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>