在javascript访问角度应用程序中的模块函数时出错“Not a Function”

时间:2016-07-17 06:26:49

标签: javascript angularjs

我目前正在与一家拥有大型角度基础设施的公司合作,在这里,我花了两天时间完成了一项任务,标记为:“在菜单上添加新链接”。

正如我所说,我必须在菜单中“添加一个链接”,但该链接必须在特定环境中打开一个带有特定页面的新窗口(想想:打开一个包含债务历史记录的页面我们正在观看的特定客户)

要调用此页面,我需要向特定的ActionBean发帖(不要​​问为什么。我不知道。遗留代码很大,我是一个没有决策权的简单士兵)。经过大量的努力,我可以认为公司在AngularJs中有一个库来创建这个“帖子”请求。简化定义将是:

angular.module('myApp.formBuilder', []).factory('myAppFormBuilder', ['MyAppPleaseWaitModal', function (myAppPleaseWaitModal) {
                            function FormBuilder(url, method) {
                                this.$form = $('<form />').prop({
                                    action: url,
                                    method: method || 'post'
                                });
                            }
            FormBuilder.prototype.add = function (name, value) { .. }
            FormBuilder.prototype.submit = function () { .. }
            return {
                    /**
                     * Creates a new builder
                     * 
                     * @param url
                     * @param [method]
                     * @return {FormBuilder}
                     */
                    create: function (url, method) {
                        return new FormBuilder(url, method);
                    }
                };

以及使用它的方式(基于其他页面中的先前代码)

define(['angular', 'lodash'], function (angular, _) {
    var module = angular.module('somethingController', ['myapp.formBuilder']);

    module.controller('SomethingController', ['$scope', '$timeout',  'myappPleaseWaitModal', 'myappFormBuilder', 
                                                    function ($scope, $timeout, myappFormBuilder) {


        $scope.goToDamnPage = function () {
            myappFormBuilder
               .create(CONTEXT_PATH + "/app/ClientOverview.action")
               .add('id', $scope.client.Id)
               .target("_blank")
               .submit();
            };


         // other stuff


    }]);

最后,视图有了这个

<li> <a  href="javascript:void(0)" id="goToDamnPageBtn"  ng-click="goToDamnPage()" >Damn Page<span class="glyphicon glyphicon-share"></span></a></li>

当我点击链接时,我收到一个丑陋的错误:错误:myappFormBuilder.create不是函数

指向angular.js上的以下行的指针

enter image description here 我怀疑我需要一些引用,因为显然不知道myappFormBuilder.create返回一个函数,但我可能无法弄清楚它是哪一个。我怀疑任何有经验的有角度的开发人员都可以立即发现......这很愚蠢......遗憾的是,我对这项技术太新了

我最好的问候和提前感谢

2 个答案:

答案 0 :(得分:0)

您需要在函数中包含 myappPleaseWaitModal ,因为您已在控制器定义中的数组中以相同的顺序传递它。

这将解决问题:

module.controller('SomethingController', ['$scope', '$timeout',  'myappPleaseWaitModal', 'myappFormBuilder', 
    function ($scope, $timeout,myappPleaseWaitModal, myappFormBuilder) {


}]);

原因:当您在定义控制器时提及阵列中的特定依赖序列时,angular也希望您在控制器函数中具有相同的序列。

因为在你的情况下序列不正确,有角度的'myappFormBuilder'是'myappPleaseWaitModal'。

这就是它说它不是一个功能的原因。

答案 1 :(得分:0)

你没有在控制器功能中声明'myappPleaseWaitModal'

module.controller('SomethingController', ['$scope', '$timeout',  'myappPleaseWaitModal', 'myappFormBuilder', 
                                                function ($scope, $timeout, myappPleaseWaitModal,myappFormBuilder) {

使用此

而不是

  module.controller('SomethingController', ['$scope', '$timeout',  'myappPleaseWaitModal', 'myappFormBuilder', 
                                                    function ($scope, $timeout, myappFormBuilder) {