角度解析错误 - 令牌是一个意外的令牌

时间:2016-06-03 09:25:35

标签: javascript angularjs

我创建了一个基本directive来更新div中的时间:

myApp.directive('updateTime', function($timeout, $filter) {
    return function(scope, element, attrs) {
        var timeoutId;

        function updateTime() {
            element.text($filter('dateFromNow')(attrs.updateTime));$()
        }

        scope.$watch(attrs.updateTime, function(value) {
            updateTime();
        });

        function updateLater() {
            timeoutId = $timeout(function() {
                updateTime();
                updateLater();
            }, 5000);
        }

        element.bind('$destroy', function() {
            $timeout.cancel(timeoutId);
        });

        updateLater();
    }
});

我的模型包含一个日期对象,就像2016-06-03T09:14:57.948Z一样,但Angular似乎在抱怨它采用那种格式。这是我的数据库(MongoDB)提供日期的方式。

Error: $parse:syntax
Syntax Error
Syntax Error: Token 'T09' is an unexpected token at column 11 of the expression [2016-06-03T09:14:57.948Z] starting at [T09:14:57.948Z].

如何解决此错误?

WORKING EXAMPLE

修改

这是我的dateFromNow过滤器。它只是使用MomentJS将日期对象(或日期字符串)转换为time ago字符串(例如" 2分钟前"):

myApp.filter('dateFromNow', function () {
    return function (date, onlyFromNow) {
        return moment(date).fromNow();
    }
});

在我的控制台中,我可以看到错误发生在我的指令中的scope.$watch(....内。

1 个答案:

答案 0 :(得分:1)

错误从scope.$watch抛出,因为您在传递实际值(2016-06-03T09:14:57.948Z)时需要知道变量的名称(或路径)。

您可以通过一些修改来修复它。

使用您的指令如下:

<div update-time="myTime">

通过解析它来获取updateTime()中的属性值:

 $parse(attrs.updateTime)(scope)

这需要将$parse服务注入您的指令:

.directive('updateTime', function($timeout, $filter, $parse) {
    // ...
})

这是一个工作示例: http://codepen.io/LukaszWiktor/pen/BzNLOM