【问题标题】:"device is not defined" : Codrova/Ionic + TypeScript“设备未定义”:Codrova/Ionic + TypeScript
【发布时间】:2015-09-01 19:25:47
【问题描述】:

当我在浏览器(通过ionic serve)和我的设备上加载我的 Ionic 应用程序时,我遇到了非常常见的device is not defined 错误。

我是 TypeScript 的新手,我认为我的问题可能与那里的一些误解有关。

我的 index.html 包含(请注意,我的 DOM 元素中缺少 ng-app):

    <link href="css/ionic.app.min.css" rel="stylesheet">
    <link href="css/style.css" rel="stylesheet">

    <script src="lib/ionic/js/ionic.bundle.js"></script>

    <!-- inject:js -->
    <script src="lib/node_modules/ng-cordova/dist/ng-cordova-mocks.min.js"></script>
    <script src="lib/node_modules/ng-cordova/dist/ng-cordova.min.js"></script>
    <script src="lib/node_modules/ng-cordova/src/plugins/device.js"></script>
    <script src="lib/node_modules/ng-cordova/src/plugins/file.js"></script>
    <!-- endinject -->

    <!-- cordova script (this will be a 404 during development) -->
    <script src="cordova.js"></script>

</head>
<body>

  <div ui-view=""></div>

  <script src="app.js"></script>
  <script src="bootstrapApp.js"></script>

</body>

这里,app.js 是从 TypeScript 编译而来的。我在这里做了很多事情,但有趣的是:

var App;
(function (App) {
    "use strict";
    angular.module("app", [
        "ionic",
        "ngCordova",
        "ui.router"
    ])
    .config(function ($stateProvider, $urlRouterProvider) {
        $stateProvider.state("splash", {
            url: "/splash",
            templateUrl: "components/splash/splash.html",
            controller: "SplashController"
        });
        $urlRouterProvider.otherwise("/splash");
    });
})(App || (App = {}));
var App;
(function (App) {
    "use strict";
    var DeviceService = (function () {
        function DeviceService($cordovaDevice) {
            this.device = null;
            this.device = $cordovaDevice.getDevice();
            console.log(this.device);
        }
        DeviceService.$inject = ["$cordovaDevice"];
        return DeviceService;
    })();
    angular.module("app").service("DeviceService", DeviceService);
})(App || (App = {}));

为确保我的设备“准备就绪”,我遵循了我在此处找到的建议:https://stackoverflow.com/a/27975700/3817101

所以,我有一个 bootstrapApp.js 文件,其中包含:

window.ionic.Platform.ready(function() {
    console.log("platform is ready");
    angular.bootstrap(document, ['app']);
});

在页面加载时,除了$cordovaDevice 的使用外,一切似乎都很顺利。我的控制台显示:

platform is ready
ionic.bundle.js:20306 ReferenceError: device is not defined

很明显,我正在尝试在一切“准备就绪”之前使用该设备,但我似乎无法弄清楚我哪里出错了。有什么建议吗?

【问题讨论】:

  • 不确定是否需要特定的 ionic 命令,但需要cordova 插件:cordova plugin add org.apache.cordova.device

标签: javascript angularjs cordova typescript ionic


【解决方案1】:

错误不在您发布的代码中(您需要this.device.foo 之类的东西才能得到错误,而您的代码中没有这样的.foo)。

解决方案

JS 文件的顺序可能会导致这种情况。改变:

<script src="lib/ionic/js/ionic.bundle.js"></script>

<!-- inject:js -->
<script src="lib/node_modules/ng-cordova/dist/ng-cordova-mocks.min.js"></script>
<script src="lib/node_modules/ng-cordova/dist/ng-cordova.min.js"></script>
<script src="lib/node_modules/ng-cordova/src/plugins/device.js"></script>
<script src="lib/node_modules/ng-cordova/src/plugins/file.js"></script>
<!-- endinject -->

收件人:

<!-- inject:js -->
<script src="lib/node_modules/ng-cordova/dist/ng-cordova-mocks.min.js"></script>
<script src="lib/node_modules/ng-cordova/dist/ng-cordova.min.js"></script>
<script src="lib/node_modules/ng-cordova/src/plugins/device.js"></script>
<script src="lib/node_modules/ng-cordova/src/plugins/file.js"></script>
<!-- endinject -->

<script src="lib/ionic/js/ionic.bundle.js"></script>

【讨论】:

  • 移动 ionic.bundle.js 脚本会导致更多问题,因为其中包括 Angular。另外,我的device is not defined 错误是由以下行引起的:this.device = $cordovaDevice.getDevice();(将其注释掉导致控制台中没有错误)
猜你喜欢
  • 2015-04-19
  • 1970-01-01
  • 2016-07-02
  • 2016-12-10
  • 2020-04-30
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多