cordova:app-preferences:TypeError:string不是函数

时间:2015-12-25 16:55:07

标签: cordova ionic-framework ionic

我已将app-preferences插件添加到我的离子项目中。 当我在我的Android设备上运行并尝试存储密钥时,我得到了下一个错误:

TypeError: string is not a function
at nativeExec (http://10.0.0.28:8100/plugins/cordova-plugin-app-preferences/www/apppreferences.js:175:11)
at AppPreferences.store (http://10.0.0.28:8100/plugins/cordova-plugin-app-preferences/www/apppreferences.js:187:3)
at Object.store (http://10.0.0.28:8100/lib/ngCordova/dist/ng-cordova.min.js:9:10072)
at set (http://10.0.0.28:8100/js/just-go.js:1104:29)
at setUser (http://10.0.0.28:8100/js/just-go.js:1276:27)
at http://10.0.0.28:8100/js/just-go.js:1069:23
at processQueue (http://10.0.0.28:8100/lib/ionic/js/ionic.bundle.js:27747:28)
at http://10.0.0.28:8100/lib/ionic/js/ionic.bundle.js:27763:27
at Scope.$eval (http://10.0.0.28:8100/lib/ionic/js/ionic.bundle.js:29026:28)
at Scope.$digest (http://10.0.0.28:8100/lib/ionic/js/ionic.bundle.js:28837:31)

这是我存储密钥的代码片段:

  function set(key, value) {
    var defer = $q.defer();
    console.log("Setting keys");
    $cordovaPreferences.store(key, value)
      .success(function(data) {
        console.log("key set");
        defer.resolve(data);
      })
      .error(function(error) {
        defer.reject(error);
        console.log("fail to set");
        console.log(error);
      });

    return defer.promise;
  };
任何人都知道问题是什么? 参数I; m发送是"令牌"作为键和一些字符串作为值..

PS可以在浏览器上使用此插件运行吗? (用于检测) 当我尝试用它做一些事情我得到插件没有启用/

3 个答案:

答案 0 :(得分:0)

由于apppreferences.js文件以这种方式定义 store 方法,第一个和第二个param必须有函数而不是字符串:

 /**
 * Set a preference value
 *
 * @param {Function} successCallback The function to call when the value is set successfully
 * @param {Function} errorCallback The function to call when value is not set
 * @param {String} dict Dictionary for key (OPTIONAL)
 * @param {String} key Key
 * @param {String} value Value
 */
AppPreferences.prototype.store = platform.store || function (
successCallback, errorCallback, dict, key, value
    ) {
    ....
    }

在你的函数 set 中,两个字符串键和值都作为第一个和第二个参数而不是函数传递。

答案 1 :(得分:0)

我的项目遇到了同样的问题。 您使用ECMALcript5.1的compiller构建项目,此插件使用ECMAScript6(Promise)中的全局变量。 你必须将ECMAScript6的编译器添加到你的IDE(对我而言,它是WebStorm,我添加了babel,你可以阅读这个标题http://blog.jetbrains.com/webstorm/2015/05/ecmascript-6-in-webstorm-transpiling/) 之后你必须添加es6-promise https://www.npmjs.com/package/es6-promise

答案 2 :(得分:0)

好像你的ngCordova和插件版本之间存在不匹配。实际上没有检查升级ngCordova是否有效,但如果你不想升级ngCordova,你可以直接使用插件或修改ngCordova:

用回调替换他们的storeResult承诺

            // var storeResult;
            // if(arguments.length === 3){
            //     storeResult = $window.plugins.appPreferences.store(dict, key, value);
            // } else {
            //     storeResult = $window.plugins.appPreferences.store(key, value);
            // }

            // storeResult.then(ok, errorCallback);

            if(arguments.length === 3){
                storeResult = $window.plugins.appPreferences.store(ok, errorCallback, dict, key, value);
            } else {
                storeResult = $window.plugins.appPreferences.store(ok, errorCallback, key, value);
            }

商店获取删除功能