Обновить html для изменений модели directive accord

#javascript #angularjs

#javascript #angularjs

Вопрос:

Мне нужно сгенерировать рейтинги. Рейтинг — это целочисленное значение от 0 до 15. Рейтинг имеет уровни. (5 звезд: бронзовая, серебряная, золотая)

Итак, мне нужен такой html

 <span class="tb-ratings CLASS" ng-bind-html-unsafe="stars">
    <i></i>
    <i></i>
    <i></i>
    <i></i>
    ...
</span>
  

У меня была директива add

Теперь у меня проблемы:

  • количество тегов «i» не обновляется при изменении рейтинга с помощью ввода (без добавления, без удаления) — смотрите пример на http://jsfiddle.net/AdKd8/1 /
  • нужен необработанный html, без unsafe (ng-bind-html-unsafe в примере не работает)

Код приложения: http://jsfiddle.net/AdKd8/1 /

HTML: рейтинг:

 <br>need simular result:
e.g 1
<span class="tb-ratings cap" ng-bind-html-unsafe="stars">
    <i></i><i></i><i></i><i></i>
</span>
  

CSS:

 i{
    background-color: #f093f0;
    height: 10px;
    width: 10px;
    margin: 5px;
    display:block;
}

.cap i{
    background-color: red;
}

.crown i{
    background-color: green;
}

.blue i{
    background-color: blue;
}
  

JS:
функция RateCtrl($scope) {
$scope.rating = 14;
}

 angular.module('myapp', []).
  directive('myrating', function() {
        var directive = { restrict: 'E', replace: true, scope: { rating: '=' } };
      directive.template = "<h1><span class='tb-ratings {{class_value}}' ng-bind-html-unsafe='stars'></span>{{stars}}</h1>";

        directive.link = function(scope, element, attributes) {
           function gen_html(rating_value){
                if(!rating_value){
                  return
                }

                scope.class_value = "";
                var stars_count = 0;
                var step = 5
                var class_arr = ["blue", "cap", "crown"];

                for(var i=0; i<3; i  ){
                    if(rating_value > step){
                        scope.class_value = class_arr[i];
                        stars_count = rating_value - step;
                    }
                    step =5;
                }

                scope.stars = "";
                for(var i=0;i<stars_count;i  ){
                    scope.stars ="<i></i>";
                }
            }
            gen_html(scope.rating);
        }

        return directive;
  })
  

Пример:
http://jsfiddle.net/AdKd8/1 /

Комментарии:

1. некоторые изменения: jsfiddle.net/AdKd8/2

2. ng-bind-html-unsafe использовался в Angular 1.1, устарел с версии 1.2. Используйте ng-bind-html

Ответ №1:

Это то, что вы должны сделать, чтобы заставить это работать:

  • Включите angular-sanitize в свой проект
  • Объявите ngSanitize в вашем модуле
  • Используйте ng-bind-html вместо ng-bind-html-unsafe (устарел, как сказал пшно)
  • Удалите {{звездочки}} из вашего шаблона
  • Добавьте часы, чтобы звездочки обновлялись при изменении значения во входных данных

     scope.$watch('rating', function(newValue, oldValue){
        gen_html(newValue);});            
    }
      

Вот [рабочий пример] (http://jsfiddle.net/27sb5/1 /)