Angular 1.5 组件绑定:检查回调是否存在

Angular 1.5 Component Bindings: Check if Callback is Present

我有一个简单的 contactList 组件,它有 2 个绑定:contactsonRemove

app
  .component('contactList', {
    template: 
      `<div ng-repeat="c in $ctrl.contacts">
         {{c.name}}
         <div ng-click="$ctrl.onRemove({contact: c})">Remove</div>
       </div>`,
    bindings: {
      contacts: '<',
      onRemove: '&'
    },
    controller: function() {}
  })

我在我的应用程序中多次使用这个组件。 onRemove 回调的行为可能会有所不同,具体取决于 在何处 使用了 contactList 组件。示例:


想法:

首先我想,我可以使用 ng-if="$ctrl.onRemove",但这不起作用,因为 onRemovecontactList 组件中永远不会是 undefinedconsole.log(this.onRemove) 总是打印:function(locals) { return parentGet(scope, locals); }

当然,我可以使用另一个 showRemove: '@' 绑定,但对我来说这看起来 DRY


您有什么想法或更好的解决方案来完成任务吗?

最简单的方法是检查属性是否已定义。在你的控制器中注入 $attrs 然后你可以这样做:

if( $attrs.onRemove ) { //Do something }

使用 & 绑定 angular 将包装函数以保留对传递方法的原始 $scope 的引用,即使未定义也是如此。

在组件上执行 onRemove 函数允许获取函数是否传入参数。所以你可以使用 ng-if="$ctrl.onRemove()"

component('contactList', {
template: 
  `<div ng-repeat="c in $ctrl.contacts">
     {{c.name}}
     <div ng-click="$ctrl.onRemove()({contact: c})" ng-if="$ctrl.onRemove()">Remove</div>
   </div>`,
bindings: {
  contacts: '<',
  onRemove: '&'
},
controller: function() {
  console.log(this.onRemove);
  console.log(this.onRemove());
}
})

另一种选择是通过在绑定定义中添加问号来将回调定义为可选的: onRemove: '&?'

文档中的文本:All 4 kinds of bindings (@, =, <, and &) can be made optional by adding ? to the expression. The marker must come after the mode and before the attribute name. See the Invalid Isolate Scope Definition error for definition examples.