试图根据this blog post从angular-ui-bootstrap中装饰typeahead指令并遇到麻烦。我需要替换keydown
绑定(直到某些PR会修复它以按预期运行),所以我想我可以获取指令来装饰,调用link.apply(this,arguments)然后只需插入{ {1}}再次绑定,如下面的代码示例所示:
keydown
但是我得到的错误表明scope.matches不存在(未定义) - 意味着指令原始范围没有真正运行 - 尝试使用原始指令中的其他变量失败并出现相同的错误。我该如何解决这个问题?
感谢您的帮助
答案 0 :(得分:2)
Typeahead创建一个内部子范围。 查看typeahead source:
你会看到这个:
//create a child scope for the typeahead directive so we are not polluting original scope
//with typeahead-specific data (matches, query etc.)
var scope = originalScope.$new();
originalScope.$on('$destroy', function(){
scope.$destroy();
});
正如评论中所述,matches
以及您尝试访问的其他变量都在该子范围内,而不是您正在查看的范围。
由于在父(originalScope
)被销毁之前该子范围未被销毁,您可以通过$$childHead
访问它。使用内部$$
变量可能会有风险 - 但在Angular's scope documentation中已经讨论过了,所以希望这意味着他们打算保留这个属性。
修复是在link.apply(this, arguments);
之后添加以下行,然后在装饰器中使用childScope
:
childScope = scope.$$childHead;
添加,此行现在可以使用:
console.log('scope matches', childScope.matches)