56

Эта директива пытается создать элемент HTML, называемый индикатором выполнения, который отслеживает прогресс при перемещении страницы на страницу. Я пытаюсь разработать его для использования как: <progress-bar progress='1' max='6' error="true"></progress-bar>AngularJS Directive Passing String

Я просто пытаюсь передать информацию из элемента ^^ в html в мою директиву и обработать информацию, чтобы соответствующим образом изменить индикатор выполнения.

Это работает для «прогресса» и «макс», которые принимают целочисленные значения, но по какой-то причине код с комментариями, который обрабатывал бы «ошибку» (которая является строкой), вызывает проблемы. Я новичок в angularJS, поэтому я сожалею, если какое-либо из этого звучит сбивающим с толку или непонятным ... спросите, нужно ли мне уточнять/разъяснять. Заранее спасибо!

app.directive('progressBar', function(){ 

var compileProgressBar = function(scope, elem, attrs) { 
    var append = '<nav class="navbar navbar-fixed-bottom navbar-footer" role="navigation">\ 
        <div class="container">\ 
         <div class="row">'; 
    var i = 1; 
    while (i <= parseInt(scope.max)) { 
     if (i <= parseInt(scope.progress)) { 
      //if (scope.error == "true"){ 
       //... 
      //} 
      //else { 
      append += '<div class="col-xs-1"><div class="circle-filled"><center>'+i+'</center></div></div>' 
      //} 
     } else { 
      append += '<div class="col-xs-1"><div class="circle-hallow"><center>'+i+'</center></div></div>' 
     } 
     i++; 
    } 
    append += '</div></div></nav>' 
    elem.append(append); 
    elem.bind('click', function(){ 
     if (scope.progress > 1) { 
      history.back(); 
      scope.$apply(); 
     } 
    }); 
} 

return { 
    restrict: 'AE', 
    scope: { 
     max: '=max', 
     progress: '=progress' 
     //error: '=error' 
    }, 
    link: compileProgressBar 
} 

});

+0

что history.back(); –

+0

Вы уверены, что ошибка является строкой, а не boolean? –

+0

history.back() добавляет обратно функциональность в индикатор выполнения - когда вы нажимаете индикатор выполнения, он действует как щелчок по кнопке «Назад» в браузере. Это прекрасно работает так, как есть. Кроме того, вы правы, что ошибка должна быть логической. Тем не менее, я до сих пор не понял, как передать логическое значение из html в директиву:/ Снова большое спасибо – profoundWanderer

ответ

96

В вашей директиве вы используете двунаправленную привязку атрибутов из глобальной области действия в локальную область директивы.

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

При тестировании scope.error == "true", вы на самом деле тестирования true == "true", и это имеет значение ложных в JavaScript.

Чтобы устранить проблему, вы можете:

  • либо использовать строку в кавычках, когда звонит директиву:

    <progress-bar progress='1' max='6' error="'true'"></progress-bar> 
    
  • или изменить режим привязки в вашей директиве, так как вы не необходимо двунаправленное связывание. @ переменные всегда имеют строку типа.

    return { 
        restrict: 'AE', 
        scope: { 
         max: '@max', 
         progress: '@progress', 
         error: '@error' 
        }, 
        link: compileProgressBar 
    } 
    

Вы можете найти более подробную информацию о режимах связывания в Angular $compile documentation

+0

Это очень полезно; большое спасибо. Тем не менее, проблема еще не в том, что сравнительный тест неправильно оценивается .... по какой-то причине мой сайт падает, когда я раскомментирую 'error: '= error''.По какой-то причине эта строка вызывает проблему и меняет ее на 'error: '@ error'', которая не разрешает проблему. Хорошо знать, что мой текущий код будет проверять «true ==» true », если бы я попал на этот этап, так что спасибо за подсказку выше – profoundWanderer

+2

Я предполагаю, что вы добавляете запятую после проделанной работы, когда раскомментируете ошибку избегайте тривиальной синтаксической ошибки. Какова ваша консольная ошибка при раскомментировании строки? – rluta

+0

wow .. ROOKIE MISTAKE !! Спасибо rluta, для предвидения моей реальной проблемы и определения моего текущего/глупого. Решаемые. Очень признателен. – profoundWanderer