简体   繁体   English

无法识别AngularJS控制器功能

[英]AngularJS controller function not recognized

I have an AngularJS project with the structure shown in the first picture. 我有一个AngularJS项目,其结构如第一幅图所示。 I use custom tags defined as angularJS components. 我使用定义为angularJS组件的自定义标签。

AngularJS项目结构。

My main layout uses the custom tag by displaying it in a tab. 我的主布局通过在标签中显示自定义标签来使用它。 The code snippet from my main-layout component is the following: 我的主布局组件中的代码段如下:

<uib-tabset type="pills" active="$ctrl.getActiveTab()">

    <uib-tab class="mormontTab" heading="Tab0" ng-show="$ctrl.drFormActive() && $ctrl.daFormInactive()" ng-click="$ctrl.setActiveTab(0)">
        <drform-tag></drform-tag>
    </uib-tab>

    <uib-tab class="mormontTab" heading="Tab1" ng-show="$ctrl.daFormActive() && $ctrl.drFormInactive()" ng-click="$ctrl.setActiveTab(1)">
        <daform-tag></daform-tag>
    </uib-tab>

    <uib-tab class="mormontTab" heading="Tab2" ng-click="$ctrl.setActiveTab(2)">
        <mydocs-tag></mydocs-tag>
    </uib-tab>

    <uib-tab class="mormontTab" heading="Tab3" ng-click="$ctrl.setActiveTab(3)">
    <fluxdocs-tag></fluxdocs-tag>
    </uib-tab>

    <uib-tab class="mormontTab" heading="Tab4" ng-click="$ctrl.setActiveTab(4)">Tab  content
    </uib-tab>

    <uib-tab class="mormontTab" heading="Tab5" ng-click="$ctrl.setActiveTab(5)">Tab  content
    </uib-tab>
</uib-tabset>

My custom tag is a form with many user inputs (associated with ng-model parameters). 我的自定义标签是具有许多用户输入的表单(与ng-model参数关联)。

The custom tag component is defined in the daform-tag.js file as folows: 自定义标签组件在daform-tag.js文件中定义如下:

angular.module('EasyDocsUBBApp')
    .component('daformTag', {
        templateUrl: 'da-doc/daform-tag.html',
        controller: function (AppService) {
        $ctrl = this;

        $ctrl.expenses = [];

        $ctrl.handleForm = function () {
            AppService.setActiveTab(2);
            AppService.handleDAForm("D");
        };

        $ctrl.handleForm = function () {
            AppService.setActiveTab(2);
            AppService.handleDAForm("D");
        };

        $ctrl.getSumaCercetareSolicitata = function () {
            var suma = 0;
            if ($ctrl.sumaDIFN != undefined)
                suma += $ctrl.sumaDIFN;
            if ($ctrl.sumaDIFI != undefined)
                suma += $ctrl.sumaDIFI;
            if ($ctrl.sumaDICTA != undefined)
                suma += $ctrl.sumaDICTA;
            return suma;
        };

        $ctrl.getSumaCercetareAprobata = function () {
            var suma = 0;
            if ($ctrl.sumaDIFNAC != undefined)
                suma += $ctrl.sumaDIFNAC;
            if ($ctrl.sumaDIFIAC != undefined)
                suma += $ctrl.sumaDIFIAC;
            if ($ctrl.sumaDICTAAC != undefined)
                suma += $ctrl.sumaDICTAAC;
            return suma;
        };

        $ctrl.getSumaCercetare = function () {
            return (ctrl.getSumaCercetareSolicitata() + $ctrl.getSumaCercetareAprobata());
        };


        $ctrl.getSumaAlteleSolicitata = function () {
            var suma = 0;
            if ($ctrl.sumaDIFS != undefined)
                suma += $ctrl.sumaDIFS;
            if ($ctrl.sumaDIFE != undefined)
                suma += $ctrl.sumaDIFE;
            if ($ctrl.sumaDITA != undefined)
                suma += $ctrl.sumaDITA;
            return suma;
        };

        $ctrl.getSumaAlteleAprobata = function () {
            var suma = 0;
            if ($ctrl.sumaDIFSAC != undefined)
                suma += $ctrl.sumaDIFSAC;
            if ($ctrl.sumaDIFEAC != undefined)
                suma += $ctrl.sumaDIFEAC;
            if ($ctrl.sumaDITAAC != undefined)
                suma += $ctrl.sumaDITAAC;
            return suma;
        };

        $ctrl.getSumaAltele = function () {
            return ($ctrl.getSumaAlteleSolicitata() + $ctrl.getSumaAlteleAprobata());
        };


        $ctrl.getSumaTotalaSolicitata = function () {
            var suma = 0;
            if ($ctrl.sumaS != undefined)
                suma += $ctrl.sumaS;
            if ($ctrl.sumaVP != undefined)
                suma += $ctrl.sumaVP;
            return ($ctrl.getSumaCercetareSolicitata() + $ctrl.getSumaAlteleSolicitata() + suma);
        };

        $ctrl.getSumaTotalaAprobata = function () {
            var suma = 0;
            if ($ctrl.sumaSAC != undefined)
                suma += $ctrl.sumaSAC;
            if ($ctrl.sumaVPAC != undefined)
                suma += $ctrl.sumaVPAC;
            return ($ctrl.getSumaCercetareAprobata() + $ctrl.getSumaAlteleAprobata() + suma);
        };
$ctrl.submitForm = function () {
            var rN = {
                      //Json with user inputs
                     };  
            AppService.setActiveTab(0);
            AppService.createDADoc(rN);
        };

    }
});

Mainly, the purpose of the functions above is to take user inputs (numbers) and to display inside a disabled input, the sum of the numbers entered in multiple inputs by the user. 主要是,上述功能的目的是获取用户输入(数字)并在禁用的输入中显示用户在多个输入中输入的数字总和。 Consequently, the disabled inputs that display the sum of the numbers entered by the user refer the functions above using the 'value' attribute, inside my custom tag. 因此,显示用户输入的数字总和的禁用输入将在我的自定义标签内使用“值”属性引用上述功能。 Such an example is as follows: 这样的例子如下:

<label>Sum</label>
<input type="number" class="form-control mormontInput" value="{{$ctrl.getSumaCercetareAprobata()}}" placeholder="0" disabled>

My issue is that, when the component is loaded I get in console errors like the following: 我的问题是,加载组件时,出现如下控制台错误:

错误

As I am relatively new to AngularJS, I am probably doing something wrong. 由于我是AngularJS的新手,所以我可能做错了什么。 Could someone help me with this? 有人可以帮我吗?

I should add that the uib-tab that contains the custom tag in question is shown or not-shown using ng-show attribute. 我应该补充一点,使用ng-show属性显示或不显示包含有问题的自定义标签的uib选项卡。

Why does the error say 'function name' is not a function in controller .$ctrl. 为什么错误显示“函数名称”不是控制器 。$ ctrl中的函数。 ... ? ...?

UPDATE: When I use my custom component outside the uib-tabset, it works just fine. 更新:当我在uib-tabset之外使用我的自定义组件时,它工作正常。 Only when used inside the uib-tabset leads to the described issues. 仅当在uib选项卡中使用时,才导致所描述的问题。

Thank you a lot. 非常感谢。

Here you put ctrl instead of $ctrl 在这里,您输入ctrl而不是$ ctrl

 $ctrl.getSumaCercetare = function () {
            return (ctrl.getSumaCercetareSolicitata() + $ctrl.getSumaCercetareAprobata());
        };

but I don't think that this can cause your issue 但我认为这不会引起您的问题

Here's my shot in the dark: instead of '$ctrl = this;' 这是我在黑暗中的镜头:而不是'$ ctrl = this;' at the very minimum you need to say 'var $ctrl = this;'. 至少您需要说“ var $ ctrl = this;”。

And really, you shouldn't use '$ctrl' inside your controller (that's just for use in the the template); 实际上,您不应该在控制器内使用“ $ ctrl”(仅用于模板)。 you should use something like 'var vm = this;' 您应该使用类似“ var vm = this;”的名称 or just use 'this'. 或仅使用“ this”。

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM