如何从控制器调用指令范围上的函数

时间:2013-07-22 14:36:22

标签: javascript angularjs

我在互联网上搜索过,无法找到解决方案,请帮忙!

directive('menu',function(){
    return{
        link : function(scope,element,attrs){
            scope.foo = function(){
            alert('test!');
            }
        },
        controller : function($scope){
            $scope.foo();
        }
    }
});

2 个答案:

答案 0 :(得分:3)

使用foo()

将来电延迟至$evalAsync()
controller : function($scope){
    $scope.$evalAsync(function() {
        $scope.foo();
        console.log($scope);
    });
}

fiddle

您也可以使用$timeout()代替$evalAsync()。两者都允许首先执行链接功能。

答案 1 :(得分:1)

正如Ye Liu所说,你的控制器调用指令的编译然后链接函数。 从角度指令doc(http://docs.angularjs.org/guide/directive):

  

在预链接阶段之前实例化控制器

控制器将在您的应用程序范围内,一旦后链接功能完成,您的指令将成为此范围的子项。考虑到链接函数的目的是将模型数据绑定到模板并设置监视绑定变量,而不是创建谨慎的“指令对象”。

如果您尝试在链接函数内部设置foo函数以访问指令范围变量,请查看“scope:”指令属性中的指令委托函数和绑定变量。角度指令教程给出了一个有点钝的版本作为它的最后一个例子(“zippy”),而Angularjs Directive Delegate not firing through intermediary handler给出了一个可以从模板本身调用的委托函数的例子。