使表达式的孤立范围单向数据绑定可选

时间:2015-04-28 21:40:53

标签: angularjs angularjs-directive angularjs-scope

在我的指令中,我创建了一个将表达式绑定到属性的隔离范围:

scope: {
    foo: '@'
}

在指令中,如果我尝试控制日志scope.foo,我将获得以下功能:

function (locals) {
    return parentGet(scope, locals);
}

然后执行scope.foo()将调用父范围中的表达式。问题是,我传入的表达式是一个可选的回调函数,但我没有安全的方法来判断属性是否是从父类定义的。无论属性保持什么表达式,我都会得到函数,即使它没有被指定。

因此,对scope.foo的存在进行测试显然无济于事,我无法测试scope.foo(),因为如果存在表达式,则会对表达式进行求值。有没有一种方法可以使表达式绑定可选?我希望在绑定表达式时我们有类似'=?'的内容,但似乎没有'&?'

1 个答案:

答案 0 :(得分:1)

这是$parse派上用场的地方。它委派了确定哪个范围以及它是表达式还是常量的任务。将它与快速检查相结合,看看属性是否在那里,你可以这样做:

.directive('myDirective', function($parse){
   return {
      link: function($scope, elem, attrs){
         if (attrs.foo){
           var fooGetter = $parse(attrs.foo)
           var callback = fooGetter($parse)
           if (callback) callback.call()
         }
      }
   }
})

以下是有关该文档的文档 - $parse docs

但我对此表示满意的是,如果您正在使用任何类型的 controller-as 实现并结合回调,那么在使用{{{>>时,您可能会遇到 javascript 范围问题1}}。我更喜欢使用可选的范围回调,这就是为什么存在这个问题,以便在另一个范围内调用方法:

this

不确定您使用的Angular版本,但这是一个选项,因为我也寻求类似的解决方案 - Optional two-way binding on isolate scope for Angular Directive