【问题标题】:cordova file is undefined in Cordova application科尔多瓦应用程序中未定义科尔多瓦文件
【发布时间】:2016-01-10 08:30:38
【问题描述】:

=====Cordova 文件未定义=====

嗨。

我正在尝试使用 Cordova 学习一些移动开发。我想创建一个类似 Instagram 的应用程序,其中将存储记忆。该应用程序使用两个页面:

  • 显示所有存储记忆的页面;
  • 添加内存的页面。内存存储在本地 json 文件中。

我创建文件并在其中写入新内存的代码似乎可以工作(我无法打开创建的文件,所以我无法确定,但我没有收到任何错误...) 。 我现在正在尝试使用 ngCordova 文件插件来访问该文件并显示其内容。

这是我的代码(暂时):注意:我的代码已被翻译成英文以便更好地理解。我希望我没有翻译错误,与手头的主题无关

index.html

<head>
  <meta http-equiv="Content-Type" content="text/html; charset=utf-8"/>
  <meta charset="utf-8" />
  <meta http-equiv="Content-Security-Policy" content="default-src 'self' data: gap: https://ssl.gstatic.com 'unsafe-eval'; style-src 'self' 'unsafe-inline'; media-src *">

  <!-- Donwloaded files -->
  <script src="scripts/jquery-2.1.4.js"></script>
  <script src="scripts/angular.js"></script>
  <script src="scripts/angular-route.js"></script>
  <script src="scripts/bootstrap.js"></script>
  <script src="scripts/ng-cordova.js"></script>

  <!--Own libraries-->
  <script src="lib/index.js"></script>
  <script src="lib/app.js"></script>
  <script src="lib/controleurs/addMemoryController.js"></script>
  <script src="lib/controleurs/memoriesController.js"></script>

  <!-- Cordova reference -->
  <script src="cordova.js"></script>
  <script src="scripts/platformOverrides.js"></script>
</head>

index.js (首次加载的文件,自动生成)

(function () {
    "use strict";

    document.addEventListener( 'deviceready', onDeviceReady.bind( this ), false );

    function onDeviceReady() 
        document.addEventListener( 'pause', onPause.bind( this ), false );
        document.addEventListener( 'resume', onResume.bind( this ), false );

        //angular.bootstrap(document, ['myMemories']); //aborted try. Give me the error : Uncaught Error: [ng:btstrpd] App Already Bootstrapped with this Element 'document'
    };

    function onPause() {
    };

    function onResume() {
    };
} )();

app.js (声明应用程序)

var app = angular.module('myMemories', ['ngRoute','ngCordova']);

app.config(function ($routeProvider) {
    $routeProvider
        .when("/", {
            templateUrl: "views/memories.html",
            controller: "memoriesController"
        })
        .when("/ajouteSouvenir", {
            templateUrl: "views/addMemory.html",
            controller: "addMemoryController"
        })
        .otherwise({ redirectTo: "/" });

});

memoriesController.js

app.controller("souvenirsControleur", function ($scope,$rootScope,$cordovaFile) {

if (!$rootScope.memoriesList) {
    $cordovaFile.readAsText(cordova.file.dataDirectory, "stored_memories.json").then(
        function (pResult) {
            if (typeof (pResult) == "string") {
                $rootScope.memoriesList= JSON.parse(pResult);
            } else {
                $rootScope.memoriesList= pResult;
            }
        },
        function (pError) { console.log("error : readAsText"); console.log(pError);}
    );
}
});
  • $rootScope.memoriesList 是在 addMemoryController 中创建的数组 存储着所有的记忆
  • stored_memories.json 是存储在文件系统根目录的文件。为了创建文件,我没有使用 ngCordova,而是使用了 cordova 的“标准”函数。

我收到以下错误:TypeError: Cannot read property 'dataDirectory' of undefined。我虽然使用了正确的东西,但我在这里找到了:http://ngcordova.com/docs/plugins/file/

这是我尝试过但没有成功的方法:

  • 引导应用程序(参见 index.js 文件中的注释)
  • 使用 window.requestFileSystem() 来声明 FileSystem,就像我在另一个控制器中所做的那样,但是 $cordovaFile.readAsText() 需要一个常量。

我很确定我的错误很明显,但我无法理解......

如果您需要,我可以提供更多代码。

【问题讨论】:

    标签: cordova ngcordova visual-studio-2015 cordova-plugin-file


    【解决方案1】:

    可能是您在设备准备好之前尝试使用cordova.file。作为测试,尝试将代码移动到事件处理程序中

    document.addEventListener('deviceready', function () {
      // Put code here
    });
    

    【讨论】:

    • 这正是我尝试在 index.js 文件中执行的操作,然后引导应用程序,但出现此错误:未捕获错误:[ng:btstrpd] 应用程序已使用此元素“文档”引导
    【解决方案2】:

    所以我关注了另一个类似主题的帖子,并将其添加到我的应用程序中:

    index.js (第一个加载的文件)

    (function () {
        "use strict";
    
        angular.element(document).ready(function () {
            if (window.cordova) {
                console.log("Running in Cordova, will bootstrap AngularJS once 'deviceready' event fires.");
                document.addEventListener('deviceready', function () {
                    console.log("Deviceready event has fired, bootstrapping AngularJS.");
                    angular.bootstrap(document.body, ['myMemories']);
                }, false);
            } else {
                console.log("Running in browser, bootstrapping AngularJS now.");
                angular.bootstrap(document.body, ['myMemories']);
            }
        });
    } )();
    

    我还从我的 index.htm 文件中删除了以下行: index.html

    <html ng-app="myMemories">
    

    (我了解到 ng-app 已经引导了应用程序)


    当我启动我的代码时,我有这个:

    “在 Cordova 中运行,一旦 'deviceready' 事件触发,将引导 AngularJS。”

    “Deviceready 事件已触发,正在引导 AngularJS。”

    TypeError: 无法读取未定义的属性“dataDirectory”

    我不明白这里发生了什么。我的代码是在“devideReady”发生后执行的,所以cordova.file应该是可用的!

    【讨论】:

      【解决方案3】:

      我真的不明白这里发生了什么。Cordova.file 根本没有正确加载。

      我创建了一个新项目,从一开始就添加了插件,并在没有任何其他更改的情况下将所有内容写回。让我们把 VisualStudio 放在这里,它更容易:)

      【讨论】:

        猜你喜欢
        • 2016-02-29
        • 1970-01-01
        • 1970-01-01
        • 2018-07-08
        • 1970-01-01
        • 2017-06-08
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多