将角度表达式绑定到指令属性时,$ parse语法错误

时间:2018-02-22 00:04:20

标签: angularjs angularjs-directive angular-ui-bootstrap angular-ui-datepicker

不能使用指令

绑定模板上的属性

我似乎无法使用指令绑定模板上的属性。任何帮助或建议都会很棒!

它给了我这个错误:

  

[$ parse:syntax]语法错误:令牌' {'第2列的无效密钥   表达式[{{$ ctrl.CalendarOpen}}]从   [{$ ctrl.CalendarOpen}}]。

这是我的指示:

app.directive('datePickerDirective', [function () {
    return {
        restrict: 'AE',
        scope: {

        },
        template: `
            <input type="text" class="form-control"
                   uib-datepicker-popup="shortDate"
                   name="date" is-open="{{$ctrl.CalendarOpen}}"
                   ng-model="test" datepicker-options="dateOptions"
                   ng-required="true" close-text="Close" />`,
        controller: function() {
            var $ctrl = this;
            $ctrl.CalendarOpen = true
        },
        controllerAs: '$ctrl',
    }
}]);

1 个答案:

答案 0 :(得分:0)

{{属性中删除双重is-open括号:

template: `
    <input type="text" class="form-control"
           uib-datepicker-popup="shortDate"
           ̶n̶a̶m̶e̶=̶"̶d̶a̶t̶e̶"̶ ̶i̶s̶-̶o̶p̶e̶n̶=̶"̶{̶{̶$̶c̶t̶r̶l̶.̶C̶a̶l̶e̶n̶d̶a̶r̶O̶p̶e̶n̶}̶}̶"̶
           name="date" is-open="$ctrl.CalendarOpen"
           ng-model="test" datepicker-options="dateOptions"
           ng-required="true" close-text="Close" />`,

uib-datepicker-popup指令正在尝试使用$parse Service评估is-open属性,{{id="{{$ctrl.CalendarOpen}}"开头是非法的。

来自文档:

  

错误:$ parse:syntax语法错误

     

描述

     

表达式中存在语法错误时发生。编译表达式时会抛出这些错误。错误消息包含更准确的错误描述,包括发生错误的表达式中的位置(列)。

     

要解决此问题,请详细了解Angular Expressions,找出错误并修复表达式的语法。

     

AngularJS expressions

  

如果我添加id,则不会给我错误

在这种情况下没有错误,因为没有解析{{属性的指令。双curley Private WithEvents myItem As outlook.MailItem Private Sub myItem_AttachmentRead(ByVal myAttachment As Outlook.Attachment) If myAttachment.Type = olByValue Then MsgBox "If you change this file, also save your changes to the original file." End If End Sub 括号内的表达式由— AngularJS Error Reference - $parse:syntax Error服务进行评估,转换为文本,并插入到DOM中。

当指令将属性解析为$interpolate时,将插值混合到该表达式中是不明智的。

来自文档:

  

为什么混合插值和表达式是不好的做法:

     
      
  • 它增加了标记的复杂性
  •   
  • 无法保证它适用于每个指令,因为插值本身就是一个指令。如果另一个指令在插值运行之前访问属性数据,它将获得原始插值标记而不是数据。
  •   
  • 它会影响性能,因为插值会为范围添加另一个观察者。
  •   
  • 由于这不是推荐用法,我们不对此进行测试,对AngularJS核心的更改可能会破坏您的代码
  •   
     

Angular Expression