2015-02-27 2 views
0

У меня есть директива, которая заменяет строку времени даты mysql на месяц и дату. но он дает мне синтаксическую ошибку синтаксического анализа.angularjs синтаксическая синтаксическая ошибка при разбиении строки

Директива:

directiveApp.directive('cleanDate',function(){ 

    var monthName = ["Jan","Feb","Mar","Apr","May","Jun","Jul","Aug","Sept","Oct","Nov","Dec"]; 
    return { 
     restrict: 'AE', 
     template: '{{mon}} {{date}}', 
     scope: { 
      timeset: '=' 
     }, 
     link: function(scope, element, attr) { 
      console.log(scope.timeset); 
      var t = scope.timeset.split(/[- :]/); 
      console.log(t); 
      if (parseInt(t[0]) != 0 && parseInt(t[1])!=0 && parseInt(t[2])!=0){ 
       var d = new Date(t[0], t[1]-1, t[2], t[3], t[4], t[5]); 
       scope.mon = monthName[d.getMonth()]; 
       scope.date = d.getDate(); 
      } 
      else{ 
       scope.mon = ''; 
       scope.date=''; 
      } 

     } 
    }; 

Директива Тест:

describe('getDistance Directive',function(){ 
    var $scope,$compile,template; 
     beforeEach(inject(function(_$compile_, _$rootScope_){ 
      $scope = _$rootScope_; 
      $compile = _$compile_;  
     })); 

    it ('Check Clean Date',function(){ 
     var element = "<clean-date timeset='2015-01-20 11:17:32'></clean-date>"; 

     template = $compile(element)($scope); 
     $scope.$digest(); 
     expect(template.html()).toBe('January 20'); 
    }); 
    }); 

Но этот тест реагирует с ошибкой синтаксического анализа синтаксиса

Error: [$parse:syntax] Syntax Error: Token '11' is an unexpected token at column 12 of the expression [2015-01-20 11:17:32] starting at [11:17:32]. 

Я использую тот же код в одном из моего ионным проекта и он отлично работает, но передача в angularjs v1.2.28 дает мне головную боль. Пожалуйста, помогите

ответ

1

С scope: {timeset='='} (называемое изолированным привязкой) значение атрибута, которое мы укажем для timeset, будет рассматриваться как переменнаяName, определенная в области видимости.

Поскольку 2015-01-20 11:17:32 не является допустимым именем переменной javascript, парсер выдал ошибку.

Как мы должны использовать:

//define a scope variable 
$scope.time = "2015-01-20 11:17:32"; 

var element = "<clean-date timeset='time'></clean-date>"; 

Подробнее о угловых isolateBindings на: https://docs.angularjs.org/guide/directive

0

Вы могли бы сделать, как @ Вини-к предполагает, или вы могли бы изменить директиву использовать атрибут значение вместо привязки данных (так как вы используете значение только для инициализации вам директивы):

directiveApp.directive('cleanDate',function(){ 
    [...] 
    return { 
     [...] 
     scope: { 
      timeset: '@' 
     }, 
     [...] 
    }; 
}); 

Тогда вы могли бы использовать его как это:

<clean-date timeset="2015-01-20 11:17:32"></clean-date> 
<clean-date timeset="{{timeVarFromScope}}"></clean-date> 

Или вы могли бы пойти еще дальше, согласившись с использованием $ scope.eval! Например:

directiveApp.directive('cleanDate',function(){ 
    [...] 
    return { 
     scope: { 
     }, 
     link: function(scope, element, attr) { 
      try { 
       scope.timeset = scope.$eval(attr.timeset); 
      } catch (e) { 
       scope.timeset = attr.timeset; 
      } 
      [...] 
     } 
    }; 
}); 

Хотя это не так хороша ...

+0

Я попытался изменить timeset на @, но он возвращается NAN –

+0

Что устанавливается на NaN? scope.timeset? – jlowcs

Смежные вопросы