2015-12-21 4 views
0

Я использую контроллер для установки изображения значков для каждого списка в моей директиве ng-repeat. В настоящее время $ scope.icon_level переопределяет все остальные значения с последним значением, заданным для области. Как я могу убедиться, что каждый список получает свое значение $ scope.icon_level и не заменяется следующим значением?

HTML:

<ul class="dropdown-menu" aria-labelledby="dropdownMenu1"> 
<li ng-repeat="exemplifier in exemplifiers | orderBy:'-average_score' | limitTo:3" ng-class="exemplifier.section"><a href="#"><img ng-src="{{icon_level}}" width="30" class="{{exemplifier.section}}"/>{{exemplifier.exemplifier}}</a></li> 
</ul> 

Как установить значение области:

angular.module('ciscoImaDashboardApp').controller('keyCtrl', function ($scope, dummyData) { 

var exemplifiers = dummyData.exemplifier_data; 

for (var i = 0; i < exemplifiers.length; i++) { 
     if(exemplifiers[i].average_score < 3) { 
      $scope.icon_level = "images/[email protected]"; 
     } 
     else if(exemplifiers[i].average_score < 6) { 
      $scope.icon_level = "images/[email protected]"; 
     } 
     else if(exemplifiers[i].average_score < 9) { 
      $scope.icon_level = "images/[email protected]"; 
     } 
} 
}); 
+0

Я собирался выработать пару вариантов, которые позволяли бы решать ой вопрос, но мне тяжело, так как ваш пример на самом деле не имеет смысла. во-первых, вы повторяете «exampleplifier_data» в своем контроллере, но «примеры» в своем HTML (можно предположить, что «примеры» находятся в '$ scope', но, похоже, не совпадают). Во-вторых, ваша сравнительная переменная 'ringToHighlight', по-видимому, представляет собой некоторое значение, не связанное с параметром' instanceplifier_data', который будет одинаковым для каждой итерации? – Claies

+0

Вы решили решить свою проблему? любопытно, какой маршрут вы приняли к решению. – Claies

+0

@ Claies спасибо! Это сработало. Первый вариант (: –

ответ

0

Из-за сложности 3 условий - нг-Src, вероятно, не лучший. поэтому я дал вам более легкое решение ng-if. неприменимые изображения не будут отображаться в DOM. Я делаю предположение, что ringToHighlight является собственностью exemplifier

HTML

<li ng-repeat="exemplifier in exemplifiers | orderBy:'-average_score' |"+ 
       " limitTo:3" ng-class="exemplifier.section"> 
     <a href="#"> 
<img ng-if="exemplifier.ringToHighlight <3" src="images/[email protected]" width="30" class="{{exemplifier.section}}"/> 
<img ng-if="exemplifier.ringToHighlight >= 3 && exemplifier.ringToHighlight < 6" src="images/[email protected]" width="30" class="{{exemplifier.section}}"/> 
<img ng-if="exemplifier.ringToHighlight >= 6 && exemplifier.ringToHighlight < 9" src="images/[email protected]" width="30" class="{{exemplifier.section}}"/> 
{{exemplifier.exemplifier}} 
     </a> 
    </li> 

JS

angular.module('ciscoImaDashboardApp').controller('keyCtrl', function ($scope, dummyData) { 

var exemplifier_data = dummyData.exemplifier_data; 
$scope.exemplifiers = exemplifier_data; 

}); 
+0

Я получаю эту ошибку: GET http: // localhost: 9000/[% 22images/acorn-icon @ 2x.png% 22,% 22images/seedling-ic ... 2x.png% 22,% 22images /[email protected]%22,%22images/[email protected]%22] 404 (не найдено) –

+0

btw - где ваши $ scope.examplifiers, которые вы повторяете? – itamar

+0

Это что example_data должен быть? – itamar

0

Я хотел бы использовать «нг-класс» и присвоить стиль тега, как вы итерацию.

angular.module("app", []) 
 
.controller("main",["$scope",function($scope){ 
 
    
 
    $scope.ids =[{"id":"bob", "value": 3},{ "id": "fred","value": 1},{"id":"mark", "value": 5},{"id":"sally", "value": 3}]; 
 
    
 
    $scope.exemplifiers = $scope.ids.map(function(e){ 
 
    if(e.value > 3) {e.section = "red"; } 
 
    else if(e.value > 1){ e.section = "blue";} 
 
    else {e.section = "green";} 
 
    return e; 
 
    }); 
 
    
 
    
 
    }]);
.green { 
 
    background-color:green; 
 
    /* replace with your imgs */ 
 
    } 
 
.red { 
 
    background-color:red; 
 
    /* replace with your imgs */ 
 
    } 
 
.blue{ 
 
    background-color:blue; 
 
} 
 
img.green{ 
 
    content:url("images/[email protected]"); 
 
     } 
 

 
img.red{ 
 
content:url(images/[email protected]"; 
 
     } 
 
     
 
img.blue{ 
 
content:url("images/[email protected]" 
 
    }
<script src="https://ajax.googleapis.com/ajax/libs/angularjs/1.2.23/angular.min.js"></script> 
 
<div ng-app="app"> 
 
<div ng-controller="main" > 
 
    <ul> 
 
    <li ng-repeat="exemplifier in exemplifiers" >{{exemplifier.id}} 
 
    <img ng-class="exemplifier.section" alt="{{exemplifier.section}}" /></li> 
 
    </ul> 
 
</div> 
 
</div>

0

Есть несколько способов решить проблему, которую вы описываете здесь. Корень проблемы сводится к тому, что вы хотите представить несколько значений в своем HTML, но вы выделили только одну переменную.

Двусторонняя привязка Angular будет обеспечивать, чтобы это значение всегда обновлялось, что означает, что ваша итерация по существу перебирает весь массив и сбрасывает одну и ту же переменную в новое значение снова и снова, и ваш результат всегда будет быть последним элементом в цикле.

Существует два распространенных способа решения этой проблемы. Один из способов - создать свойство на каждом exemplifier и приложить значение к этому свойству объекта. Если увеличение ваших объектов невозможно или вызывает другие проблемы, альтернативой может быть изменение icon_level на функцию, которая может выполняться повторно и каждый раз возвращать разные результаты.

Вариант 1:

Здесь петля через exemplifiers и добавить дополнительный icon_level свойство к каждому. Заметьте, я также иллюстрирую использование angular.foreach() здесь.

var exemplifiers = dummyData.exemplifier_data; 

angular.foreach(exemplifiers, function(exemplifier) { 
    if (exemplifier.average_score < 3) { 
    exemplifier.icon_level = "images/[email protected]"; 
    } else if (exemplifier.average_score < 6) { 
    exemplifier.icon_level = "images/[email protected]"; 
    } else if (exemplifier.average_score < 9) { 
    exemplifier.icon_level = "images/[email protected]"; 
    } 
}); 
<li ng-repeat="exemplifier in exemplifiers | orderBy:'-average_score' | limitTo:3" ng-class="exemplifier.section"> 
    <a href="#"> 
    <img ng-src="{{exemplifier.icon_level}}" width="30" class="{{exemplifier.section}}" />{{exemplifier.exemplifier}}</a> 
</li> 

Вариант 2:

Здесь мы преобразуем $scope.icon_level в функцию, и вызвать его для каждой итерации ng-repeat, передавая значение, которое мы хотим проверить.

$scope.icon_level = function(level) { 
    if (level < 3) { 
    return "images/[email protected]"; 
    } else if (level < 6) { 
    return "images/[email protected]"; 
    } else if (level < 9) { 
    return "images/[email protected]"; 
    } 
} 
<li ng-repeat="exemplifier in exemplifiers | orderBy:'-average_score' | limitTo:3" ng-class="exemplifier.section"> 
    <a href="#"> 
    <img ng-src="icon_level(exemplifier.average_score)" width="30" class="{{exemplifier.section}}" />{{exemplifier.exemplifier}}</a> 
</li> 
0

Я понял это, делая используя нг стиль и установки переменной области действия в каждом контроллере представления:

JS:

<body ng-app="ciscoImaDashboardApp" ng-controller="navCtrl" ng-style="{'background-image': backgroundImg}" > 

HTML:

$rootScope.backgroundImg = "url('../images/[email protected]')";