Javascript 错误:$injector:unpr未知提供程序:未知提供程序:bProvider<;-B

Javascript 错误:$injector:unpr未知提供程序:未知提供程序:bProvider<;-B,javascript,angularjs,tomcat,grails,Javascript,Angularjs,Tomcat,Grails,我正在用AngularJS编写一个Web应用程序,后端使用Grails 在开发应用程序时,我可以使用grailsrunapp对其进行测试,但在将应用程序部署到WAR文件并将其放入Tomcat服务器时,它无法工作。以下是错误(打印到JS控制台):$injector/unpr?p0=b提供程序%20%3C-%20b 您可以在此处看到实时版本(在有限的时间内): 通常情况下,该错误不会打印出来,您将看到websocket消息正在发送(在页面上不做任何操作)。此外,红色的“释放车辆”按钮将不会显示,直到

我正在用AngularJS编写一个Web应用程序,后端使用Grails

在开发应用程序时,我可以使用
grailsrunapp
对其进行测试,但在将应用程序部署到WAR文件并将其放入Tomcat服务器时,它无法工作。以下是错误(打印到JS控制台):$injector/unpr?p0=b提供程序%20%3C-%20b

您可以在此处看到实时版本(在有限的时间内):

通常情况下,该错误不会打印出来,您将看到websocket消息正在发送(在页面上不做任何操作)。此外,红色的“释放车辆”按钮将不会显示,直到采取行动请求该许可

忽略页面顶部的选项卡和内容,这是一些未删除的测试代码:)

以下源代码取自生成的网站,而非源代码:

HTML


德比现在
initNow(“/stomp”,“JKQXV”);
☰
一个标签 两个标签 $('#myTab a:first').tab('show'); //FIXME下面的代码不起作用,需要替换为绑定两个视图以切换窗格的功能 $('a[data toggle=“tab”]”)on('show.bs.tab',函数(e){ e、 target.tab('show');//新激活的选项卡 e、 relatedTarget.tab('hide');//上一个活动选项卡 }); 德比ID:JKQXV

放行车辆

申请许可放行车辆

/资产/now-a8076e472f12cc0da0dae7cef46aa98d.js

// ----- cookies -----

// sets a cookie
function setCookie(cname, cvalue, exdays) {
    var d = new Date();
    d.setTime(d.getTime() + (exdays*24*60*60*1000));
    var expires = "expires="+d.toUTCString();
    document.cookie = cname + "=" + cvalue + "; " + expires;
}

// gets a cookie
function getCookie(cname) {
    var name = cname + "=";
    var ca = document.cookie.split(';');
    for(var i=0; i<ca.length; i++) {
        var c = ca[i];
        while (c.charAt(0)==' ') {
            c = c.substring(1);
        }
        if (c.indexOf(name) == 0) {
            return c.substring(name.length,c.length);
        }
    }
    return "";
}

// ----- utils -----

// makes a HTTP GET request async
function httpGetAsync(theUrl, callback) {
    var xmlHttp = new XMLHttpRequest();
    xmlHttp.onreadystatechange = function() { 
        if (xmlHttp.readyState == 4 && xmlHttp.status == 200) {
            callback(xmlHttp.responseText);
        }
    }
    xmlHttp.open("GET", theUrl, true); // true for asynchronous 
    xmlHttp.send(null);
}

function initNow(stomp, derbyId){
    var app = angular.module('derby-now',[]);

    // initialize websocket
    var socket = new SockJS(stomp);
    var client = Stomp.over(socket);

    // get IDs
    var clientId = getCookie('derby-now-' + derbyId);

    app.run(function($rootScope) {
        // sets the derby and client IDs in a cookie for one (1) day
        function setIdCookie() {
            setCookie('derby-now-' + derbyId, clientId, 1);
        }

        // handles websocket messages
        function messageHandler(message) {
            var event = eval('(' + message.body + ')');
            var method = event.method;

            switch(method) {
                case 'granted':
                    var permission = event.permission;

                    switch(permission){
                        case 'releaseCars':
                            $rootScope.permissionReleaseCarsGranted();
                            break;
                        default:
                            console.log("unexpected permission grant: " + permission);
                    }

                    break;
                case 'exception':
                    console.log('Server threw exception: ' + event.code);
                    break
                default:
                    console.log("unexpected method: " + method);
            }
        }

        // connects to the websocket so we can retrive messages
        function connect() {
            client.subscribe('/topic/now/' + derbyId + '/' + clientId, messageHandler);
        }

        client.connect({}, function() {
            if(clientId == "") {
                // ask the server for a client ID
                httpGetAsync('/now/' + derbyId + '/init', function(response) {
                    clientId = response;

                    // set the cookie so we can get this later
                    setIdCookie();

                    // connect to the websocket
                    connect();
                });
            } else {
                // renew cookie
                setIdCookie();

                // connect to the websocket
                connect();
            }
        });
    });

    // standard call to server
    function call(message) {
        client.send('/app/now', {}, '{' +
                '"derbyId":"' + derbyId + '",' + 
                '"clientId":"' + clientId + '",' +
                message
                + '}');
    }

    app.controller('ReleaseCarsController', ['$scope', '$rootScope', function($scope, $rootScope) {
        $scope.permissionReleaseCars = false;

        $rootScope.permissionReleaseCarsGranted = function() {
            $scope.$apply(function(){
                $scope.permissionReleaseCars = true;
            })
        }

        $scope.releaseCars = function() {
            call('"method":"releaseCars"');
        }

        $scope.requestPermissionReleaseCars = function() {
            call('"method":"requestPermission",' +
                 '"permission":"releaseCars"'
                );
        };
    }]);
}
/----cookies-----
//设置一个cookie
函数setCookie(cname、cvalue、exdays){
var d=新日期();
d、 设置时间(d.getTime()+(exdays*24*60*60*1000));
var expires=“expires=“+d.toutString();
document.cookie=cname+“=”+cvalue+”;“+expires;
}
//得到一块饼干
函数getCookie(cname){
变量名称=cname+“=”;
var ca=document.cookie.split(“;”);

对于(var i=0;i您的代码在生产中已缩小,您需要将
run
调用更改为:

app.run(['$rootScope', function($rootScope) {

不知道在发布消息之前是否做过谷歌搜索
app.run(['$rootScope', function($rootScope) {