Angular:表达式传递给具有隔离范围的自定义指令时的标记错误

时间:2016-01-06 17:39:44

标签: javascript angularjs angularjs-directive

(消息,代码等,有点修改以解释问题)

错误:

Syntax Error: Token 'promiseObject' is unexpected, expecting [:] at column 3 of the expression [{{promiseObject?promiseObject.activeDEM:0}}] starting at [promiseObject?promiseObject.activeDEM:0}}].

以下代码解释了问题:

使用的HTML:

<count-up id="feafdcds" duration="1" end-val='{{promiseObject?promiseObject.value:0}}' class="number" ></count-up>

使用的指令具有独立的范围。如果移除隔离范围,则错误消失,但是我不知道如何观察我的属性以进行更改。

angular.module('core-metronic').directive('countUp', ['$filter',
    function ($filter) {

        return {
            restrict: 'E',
            scope: {
                endVal: '='
            },
            link: function ($scope, $el, $attrs) {
                $scope.$watch('endVal',function(newValue,oldValue)
                {
                    if(newValue)
                        alert(newValue); 
                },true);

                //...more code...

            }

        }
    }
]);

1 个答案:

答案 0 :(得分:0)

您不能使用有角度的双向绑定

endVal: '='

带有角度表达式

{{promiseObject?promiseObject.value:0}}

在值更改的情况下使用双向绑定角度尝试时,将新值设置为绑定变量。 在您的情况下,您想要绑定到endVal的不是变量而是表达式。所以有角度不知道该如何处理。

您有两种选择:

  1. 如果你不需要指令之外的endVal值,你可以 使用

    endVal: '@'

  2. 而是删除模板中的评估大括号,如下所示

    <count-up id="feafdcds" duration="1" end-val='promiseObject?promiseObject.value:0' class="number" ></count-up>
    

    这将起作用并将endVal的值设置为promiseObject.value或0。 因此,您必须小心,这会将值绑定为字符串,因此实际值将为“0”或包含promiseObject值的字符串。你可能不得不再将其转换为其他地方的数字。但是这不会更新指令之外的promiseObject的值。

    1. 如果您需要在promiseObject中作为promiseObject.value的指令之外的更新值,则必须将endVal绑定到变量。所以你可以保留你的

      endVal: '='

    2. 但您必须将模板更改为

      <count-up id="feafdcds" duration="1" end-val='promiseObject.value' class="number" ></count-up>
      

      这样,当endVal更改时,Angular将始终更新promiseObject.value的值。但这也意味着您必须注意promiseObject始终存在(并且是对象)在外部控制器中的某个位置。 此外,您必须应用默认值0,您尝试在其他地方使用您的表达式。您也可以在外部控制器中执行此操作,例如通过

      初始化promiseObject
      promiseObject = {
          value: 0
      }