Angular.js修饰指令不获取指令范围

时间:2013-12-21 17:07:41

标签: javascript angularjs angularjs-directive

试图根据this blog post从angular-ui-bootstrap中装饰typeahead指令并遇到麻烦。我需要替换keydown绑定(直到某些PR会修复它以按预期运行),所以我想我可以获取指令来装饰,调用link.apply(this,arguments)然后只需插入{ {1}}再次绑定,如下面的代码示例所示:

keydown

但是我得到的错误表明scope.matches不存在(未定义) - 意味着指令原始范围没有真正运行 - 尝试使用原始指令中的其他变量失败并出现相同的错误。我该如何解决这个问题?

感谢您的帮助

1 个答案:

答案 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)

plunker