如何通过范围从另一个控制器内访问控制器的功能?

时间:2015-04-30 14:22:35

标签: javascript angularjs angularjs-scope angularjs-controller

我有以下问题,我想从控制器中调用另一个控制器的功能,我想用于导游(我正在使用ngJoyRide进行导览)。我想在另一个控制器中调用的函数是一个翻译器(LanguageController),它根据作为参数给出的键从数据库中获取字符串。如果找不到密钥,LanguageController将返回一个错误,指出无法从数据库中获取字符串。在我的index.html中获取字符串是可行的,但是我想在我的导游的overlay元素中使用它,这不起作用,但只显示语言控制器的“未获取”错误。

我的index.html如下所示:

<body>
<div class="container-fluid col-md-10 col-md-offset-1" ng-controller="LangCtrl as lc" >
    <div ng-controller="UserCtrl as uc" mail='@email' firstname='@firstname'>
        <div ng-controller="GuidedTourCtrl as gtc">
            <div ng-joy-ride="startJoyRide" config="config" on-finish="onFinish()"  on-skip="onFinish()">
              ...
              <a href="/#/language/create" class="font-white"> {{lc.getTerm('system_lang_edit')}} </a>
              ...
            </div>
        </div>
    </div>
</div>
</body>

我用于导游的控制器看起来像这样:

guidedTourModule.controller('GuidedTourCtrl',['$scope', function($scope) {
        $scope.startJoyRide = false;
        this.start = function () {
            $scope.startJoyRide = true;
        }

        $scope.config = [
            {
                type: "title",
                ...
            },
            {
                type: "element",
                selector: "#groups",
                heading: "heading",
                text:   "   <div id='title-text' class='col-md-12'>\
                                <span class='main-text'>"\
                                     + $scope.lc.getTerm('system_navi_messages') + "\
                                    text text text text\
                                </span>\
                                <br/>\
                                <br/>\
                            </div>",
                placement: "right",
                scroll: true,
                attachToBody: true
            }
        ];
        ...
}]);

我最终获得的输出对于overlay元素看起来像这样:

<div class="row">
    <div id="pop-over-text" class="col-md-12">  
        <div id='title-text' class='col-md-12'>                                
            <span class='main-text'>
                not fetched yet: system_navi_messages                                        
                text text text text                             
            </span>                             
            <br/>                               
            <br/>                           
        </div>
    </div>
</div>
...

我希望有人可以在我的代码中看到错误。提前谢谢!

1 个答案:

答案 0 :(得分:0)

事情需要清晰,

如何在语言控制器中定义'getTerm'功能,方法是使用 this.getTerm() $ scope.getTerm()。由于您使用的是别名,因此您将在语言控制器中使用this.getTerm。

您可以在overlay元素中访问getTerm函数的原因是,因为此overlay元素位于父控制器(语言控制器)中,并且您使用别名'lc'引用它在调用getTerm函数时。这就是为什么它是可以访问的 但是作为参数传递的字符串无法访问父控制器。这就是错误消息在覆盖HTML中呈现的原因。

请为您的应用制作 plunker ,这样有助于解决您的问题。