在我的指令中,我创建了一个将表达式绑定到属性的隔离范围:
scope: {
foo: '@'
}
在指令中,如果我尝试控制日志scope.foo
,我将获得以下功能:
function (locals) {
return parentGet(scope, locals);
}
然后执行scope.foo()
将调用父范围中的表达式。问题是,我传入的表达式是一个可选的回调函数,但我没有安全的方法来判断属性是否是从父类定义的。无论属性保持什么表达式,我都会得到函数,即使它没有被指定。
因此,对scope.foo
的存在进行测试显然无济于事,我无法测试scope.foo()
,因为如果存在表达式,则会对表达式进行求值。有没有一种方法可以使表达式绑定可选?我希望在绑定表达式时我们有类似'=?'
的内容,但似乎没有'&?'
。
答案 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