Ionic +LokiJS always produces "ionic.bundle.js:26794 TypeError: Cannot read property 'insert' of undefined"
Ionic +LokiJS always produces "ionic.bundle.js:26794 TypeError: Cannot read property 'insert' of undefined"
在遇到 SQLite 的所有问题之后,我想为我的 Ionic 应用程序使用不同的解决方案。 LokiJS 经常被提到,所以我尝试了一下。但是对于 LokiJS 我也没有运气。
目前我有一个非常基本的代码,应该可以正常工作:
.controller('ProjectsController', ['$scope', '$state', '$ionicPlatform', function($scope, $state, $ionicPlatform) {
var pcVm = this;
var db;
var projects1;
$ionicPlatform.ready(function(){
var idbAdapter = new LokiIndexedAdapter('loki');
db = new loki('lkr-v4', {
autoload: true,
autoloadCallback : getAllProjects,
autosave: true,
autosaveInterval: 10000,
adapter: idbAdapter
});
function getAllProjects() {
var options = {};
db.loadDatabase(options, function() {
projects1 = db.getCollection('projects'); // GET
if (!projects1) {
projects1 = db.addCollection('projects'); // ADD
}
console.log('Databaseinformation');
console.log(db);
console.log('Collectioninformation');
console.log(projects1);
});
}
console.log('Insert something');
projects1.insert({ name : 'odin' });
}); // End of .ready()
但我总是收到消息:
ionic.bundle.js:26794 TypeError: Cannot read property 'insert' of undefined
at controllers.js:309
at ionic.bundle.js:56230
at Object.ready (ionic.bundle.js:2140)
at Object.ready (ionic.bundle.js:56223)
at new <anonymous> (controllers.js:283)
at Object.instantiate (ionic.bundle.js:18010)
at $controller (ionic.bundle.js:23412)
at self.appendViewElement (ionic.bundle.js:59900)
at Object.render (ionic.bundle.js:57893)
at Object.init (ionic.bundle.js:57813)(anonymous function) @ ionic.bundle.js:26794(anonymous function) @ ionic.bundle.js:23507$broadcast @ ionic.bundle.js:30720$state.transition.resolved.then.$state.transition @ ionic.bundle.js:52157processQueue @ ionic.bundle.js:29127(anonymous function) @ ionic.bundle.js:29143$eval @ ionic.bundle.js:30395$digest @ ionic.bundle.js:30211$apply @ ionic.bundle.js:30503done @ ionic.bundle.js:24824completeRequest @ ionic.bundle.js:25022requestLoaded @ ionic.bundle.js:24963
controllers.js:301 Databaseinformation
请帮忙。也许我对 SQLite 和 LokiJS 有同样的问题?但是我找不到问题...
谢谢,
克里斯蒂安.
更新 - 2016-08-05
所以,我又花了几个小时搜索、尝试,但总是以同样的错误告终。我想知道为什么所有的教程看起来都一样,而且似乎都有效,但对我来说是不可能的 运行ning.
我完全重写了我的工厂:
(function() {
'use strict';
angular.module('lkr-v4')
.factory('PersistenceService', ['$q', 'Loki', PersistenceService]);
function PersistenceService($q, Loki) {
// Needed variables
var lkrDb; // Database
var projects; // Collection of JSON strings
// Accessible Members Up Top
// https://github.com/johnpapa/angular-styleguide/tree/master/a1#style-y052
var pService = {
initDB: initDB,
getAllProjects: getAllProjects,
addProject: addProject,
updateProject: updateProject,
deleteProject: deleteProject
};
return pService;
// Initialization of the database
function initDB() {
var idbAdapter = new LokiIndexedAdapter('loki');
lkrDb = new loki('lkr-v4', {
autoload: true,
autoloadCallback: getAllProjects,
autosave: true,
autosaveInterval: 10000,
adapter: idbAdapter
});
}
// Function to return a collection of JSON strings (all found projects) in the LokiJS database file
function getAllProjects() {
// What is $q? See https://docs.angularjs.org/api/ng/service/$q
return $q(function (resolve, reject) {
var options = {};
lkrDb.loadDatabase(options, function () {
projects = lkrDb.getCollection('projects'); // GET!
// If the database file is empty
if (!projects) {
projects = lkrDb.addCollection('projects'); // ADD!
}
resolve(projects.data);
});
});
}
// Function to add a project
function addProject(project) {
if(lkrDebug) {
console.log('Inside of addProject from the factory');
console.log('This is the projects object');
console.log(this.projects);
console.log('This is the given value of the new project');
console.log(project);
}
projects.insert(project);
}
// Function to update a project
function updateProject(project) {
projects.update(project);
}
// Function to delete a project
function deleteProject(project) {
projects.remove(project);
}
} // End of function PersistenceService
})(); // End of IIFE
我在 app.js 的 运行() 中调用了 PersistenceService.initDB()。这行得通!
我的所有页面 (4) 都有自己的控制器,用作控制器。在我第一页的控制器中,我尝试了这段代码:
// Test #1: Get data
PersistenceService.getAllProjects().then(function(projects) {
pcVm.projects = projects;
if(lkrDebug) {
console.log('Inside of getAllProjects().then() from the controller');
console.log('This is the project object from the PersistenceService');
console.log(projects);
console.log('And this ist the pcVm.projects object from the controller');
console.log(pcVm.projects);
}
});
有效!我可以在控制台中看到正确的信息,而且我没有收到任何错误。
下一个代码直接放在同一个控制器中上面的代码之后:
// Test #2: Add a project
PersistenceService.addProject({ name : 'odin' });
它在控制台上产生以下行(和错误)
Inside of addProject from the factory
persistence.services.js:65 This is the projects object
persistence.services.js:66 undefined
persistence.services.js:67 This is the given value of the new project
persistence.services.js:68 Object {name: "odin"}
ionic.bundle.js:26794 TypeError: Cannot read property 'insert' of undefined
at Object.addProject (persistence.services.js:70)
at new ProjectsController (projects.controller.js:31)
at Object.instantiate (ionic.bundle.js:18010)
at $controller (ionic.bundle.js:23412)
at self.appendViewElement (ionic.bundle.js:59900)
at Object.render (ionic.bundle.js:57893)
at Object.init (ionic.bundle.js:57813)
at self.render (ionic.bundle.js:59759)
at self.register (ionic.bundle.js:59717)
at updateView (ionic.bundle.js:65398)(anonymous function) @ ionic.bundle.js:26794(anonymous function) @ ionic.bundle.js:23507$broadcast @ ionic.bundle.js:30720$state.transition.resolved.then.$state.transition @ ionic.bundle.js:52157processQueue @ ionic.bundle.js:29127(anonymous function) @ ionic.bundle.js:29143$eval @ ionic.bundle.js:30395$digest @ ionic.bundle.js:30211$apply @ ionic.bundle.js:30503done @ ionic.bundle.js:24824completeRequest @ ionic.bundle.js:25022requestLoaded @ ionic.bundle.js:24963
projects.controller.js:22 Inside of getAllProjects().then() from the controller
projects.controller.js:23 This is the project object from the PersistenceService
projects.controller.js:24 [Object, Object, Object, Object, Object, Object, Object, Object, Object, Object, Object, Object, Object, Object, Object, Object, Object, Object, Object]
projects.controller.js:25 And this ist the pcVm.projects object from the controller
projects.controller.js:26 [Object, Object, Object, Object, Object, Object, Object, Object, Object, Object, Object, Object, Object, Object, Object, Object, Object, Object, Object]
这有点奇怪,因为对我来说,addProject() 似乎是在 getAllProjects() 之前调用的?
所以我添加了行 console.log(lkrDb);在 addProject 函数中,查看数据库是否已加载,我做了更多测试。事实证明,app.js 中的 initDB 正在运行,addProject 函数也可以与打开的数据库一起使用。
我的结论是,我在控制器或 getAllProjects 函数中做错了!?
我会继续搜索,但我会非常感谢任何提示...
谢谢,
克里斯蒂安.
projects1 未正确初始化您必须仅在 db.loadDatabase()
callback
之后调用 projects1.insert()
这应该有效。这只是一个峰值,尝试使用 factory
进行数据库操作。并检查 javascript 变量范围,这样你就不会再遇到这个问题了。
db.loadDatabase(options, function() {
projects1 = db.getCollection('projects');
if (!projects1) {
projects1 = db.addCollection('projects');
}
projects1.insert({name: 'odin'});
});
希望对您有所帮助,编码愉快:)
更新:请根据您的实际问题更新问题。
现在我明白了承诺的事情了!这对我帮助很大:http://andyshora.com/promises-angularjs-explained-as-cartoon.html
但是,即使这是我必须真正处理的事情,这也不是问题。问题是基于我使用的教程。我不知道为什么以及如何工作,但 tutorilas 工作,而我的应用程序不只是因为:只要我不调用 getAllProjects() 函数,projects1 变量就没有数据。 autoloadCallback 不会自动调用函数!?我在 LokiJS 项目上开了一个 Issue,问我做错了什么,或者这不是 autoloadCallback 的想法。
当我有一个完整的工作解决方案时,我会post在这里...
在遇到 SQLite 的所有问题之后,我想为我的 Ionic 应用程序使用不同的解决方案。 LokiJS 经常被提到,所以我尝试了一下。但是对于 LokiJS 我也没有运气。
目前我有一个非常基本的代码,应该可以正常工作:
.controller('ProjectsController', ['$scope', '$state', '$ionicPlatform', function($scope, $state, $ionicPlatform) {
var pcVm = this;
var db;
var projects1;
$ionicPlatform.ready(function(){
var idbAdapter = new LokiIndexedAdapter('loki');
db = new loki('lkr-v4', {
autoload: true,
autoloadCallback : getAllProjects,
autosave: true,
autosaveInterval: 10000,
adapter: idbAdapter
});
function getAllProjects() {
var options = {};
db.loadDatabase(options, function() {
projects1 = db.getCollection('projects'); // GET
if (!projects1) {
projects1 = db.addCollection('projects'); // ADD
}
console.log('Databaseinformation');
console.log(db);
console.log('Collectioninformation');
console.log(projects1);
});
}
console.log('Insert something');
projects1.insert({ name : 'odin' });
}); // End of .ready()
但我总是收到消息:
ionic.bundle.js:26794 TypeError: Cannot read property 'insert' of undefined
at controllers.js:309
at ionic.bundle.js:56230
at Object.ready (ionic.bundle.js:2140)
at Object.ready (ionic.bundle.js:56223)
at new <anonymous> (controllers.js:283)
at Object.instantiate (ionic.bundle.js:18010)
at $controller (ionic.bundle.js:23412)
at self.appendViewElement (ionic.bundle.js:59900)
at Object.render (ionic.bundle.js:57893)
at Object.init (ionic.bundle.js:57813)(anonymous function) @ ionic.bundle.js:26794(anonymous function) @ ionic.bundle.js:23507$broadcast @ ionic.bundle.js:30720$state.transition.resolved.then.$state.transition @ ionic.bundle.js:52157processQueue @ ionic.bundle.js:29127(anonymous function) @ ionic.bundle.js:29143$eval @ ionic.bundle.js:30395$digest @ ionic.bundle.js:30211$apply @ ionic.bundle.js:30503done @ ionic.bundle.js:24824completeRequest @ ionic.bundle.js:25022requestLoaded @ ionic.bundle.js:24963
controllers.js:301 Databaseinformation
请帮忙。也许我对 SQLite 和 LokiJS 有同样的问题?但是我找不到问题...
谢谢, 克里斯蒂安.
更新 - 2016-08-05
所以,我又花了几个小时搜索、尝试,但总是以同样的错误告终。我想知道为什么所有的教程看起来都一样,而且似乎都有效,但对我来说是不可能的 运行ning.
我完全重写了我的工厂:
(function() {
'use strict';
angular.module('lkr-v4')
.factory('PersistenceService', ['$q', 'Loki', PersistenceService]);
function PersistenceService($q, Loki) {
// Needed variables
var lkrDb; // Database
var projects; // Collection of JSON strings
// Accessible Members Up Top
// https://github.com/johnpapa/angular-styleguide/tree/master/a1#style-y052
var pService = {
initDB: initDB,
getAllProjects: getAllProjects,
addProject: addProject,
updateProject: updateProject,
deleteProject: deleteProject
};
return pService;
// Initialization of the database
function initDB() {
var idbAdapter = new LokiIndexedAdapter('loki');
lkrDb = new loki('lkr-v4', {
autoload: true,
autoloadCallback: getAllProjects,
autosave: true,
autosaveInterval: 10000,
adapter: idbAdapter
});
}
// Function to return a collection of JSON strings (all found projects) in the LokiJS database file
function getAllProjects() {
// What is $q? See https://docs.angularjs.org/api/ng/service/$q
return $q(function (resolve, reject) {
var options = {};
lkrDb.loadDatabase(options, function () {
projects = lkrDb.getCollection('projects'); // GET!
// If the database file is empty
if (!projects) {
projects = lkrDb.addCollection('projects'); // ADD!
}
resolve(projects.data);
});
});
}
// Function to add a project
function addProject(project) {
if(lkrDebug) {
console.log('Inside of addProject from the factory');
console.log('This is the projects object');
console.log(this.projects);
console.log('This is the given value of the new project');
console.log(project);
}
projects.insert(project);
}
// Function to update a project
function updateProject(project) {
projects.update(project);
}
// Function to delete a project
function deleteProject(project) {
projects.remove(project);
}
} // End of function PersistenceService
})(); // End of IIFE
我在 app.js 的 运行() 中调用了 PersistenceService.initDB()。这行得通!
我的所有页面 (4) 都有自己的控制器,用作控制器。在我第一页的控制器中,我尝试了这段代码:
// Test #1: Get data
PersistenceService.getAllProjects().then(function(projects) {
pcVm.projects = projects;
if(lkrDebug) {
console.log('Inside of getAllProjects().then() from the controller');
console.log('This is the project object from the PersistenceService');
console.log(projects);
console.log('And this ist the pcVm.projects object from the controller');
console.log(pcVm.projects);
}
});
有效!我可以在控制台中看到正确的信息,而且我没有收到任何错误。
下一个代码直接放在同一个控制器中上面的代码之后:
// Test #2: Add a project
PersistenceService.addProject({ name : 'odin' });
它在控制台上产生以下行(和错误)
Inside of addProject from the factory
persistence.services.js:65 This is the projects object
persistence.services.js:66 undefined
persistence.services.js:67 This is the given value of the new project
persistence.services.js:68 Object {name: "odin"}
ionic.bundle.js:26794 TypeError: Cannot read property 'insert' of undefined
at Object.addProject (persistence.services.js:70)
at new ProjectsController (projects.controller.js:31)
at Object.instantiate (ionic.bundle.js:18010)
at $controller (ionic.bundle.js:23412)
at self.appendViewElement (ionic.bundle.js:59900)
at Object.render (ionic.bundle.js:57893)
at Object.init (ionic.bundle.js:57813)
at self.render (ionic.bundle.js:59759)
at self.register (ionic.bundle.js:59717)
at updateView (ionic.bundle.js:65398)(anonymous function) @ ionic.bundle.js:26794(anonymous function) @ ionic.bundle.js:23507$broadcast @ ionic.bundle.js:30720$state.transition.resolved.then.$state.transition @ ionic.bundle.js:52157processQueue @ ionic.bundle.js:29127(anonymous function) @ ionic.bundle.js:29143$eval @ ionic.bundle.js:30395$digest @ ionic.bundle.js:30211$apply @ ionic.bundle.js:30503done @ ionic.bundle.js:24824completeRequest @ ionic.bundle.js:25022requestLoaded @ ionic.bundle.js:24963
projects.controller.js:22 Inside of getAllProjects().then() from the controller
projects.controller.js:23 This is the project object from the PersistenceService
projects.controller.js:24 [Object, Object, Object, Object, Object, Object, Object, Object, Object, Object, Object, Object, Object, Object, Object, Object, Object, Object, Object]
projects.controller.js:25 And this ist the pcVm.projects object from the controller
projects.controller.js:26 [Object, Object, Object, Object, Object, Object, Object, Object, Object, Object, Object, Object, Object, Object, Object, Object, Object, Object, Object]
这有点奇怪,因为对我来说,addProject() 似乎是在 getAllProjects() 之前调用的?
所以我添加了行 console.log(lkrDb);在 addProject 函数中,查看数据库是否已加载,我做了更多测试。事实证明,app.js 中的 initDB 正在运行,addProject 函数也可以与打开的数据库一起使用。
我的结论是,我在控制器或 getAllProjects 函数中做错了!?
我会继续搜索,但我会非常感谢任何提示...
谢谢, 克里斯蒂安.
projects1 未正确初始化您必须仅在 db.loadDatabase()
callback
projects1.insert()
这应该有效。这只是一个峰值,尝试使用 factory
进行数据库操作。并检查 javascript 变量范围,这样你就不会再遇到这个问题了。
db.loadDatabase(options, function() {
projects1 = db.getCollection('projects');
if (!projects1) {
projects1 = db.addCollection('projects');
}
projects1.insert({name: 'odin'});
});
希望对您有所帮助,编码愉快:)
更新:请根据您的实际问题更新问题。
现在我明白了承诺的事情了!这对我帮助很大:http://andyshora.com/promises-angularjs-explained-as-cartoon.html
但是,即使这是我必须真正处理的事情,这也不是问题。问题是基于我使用的教程。我不知道为什么以及如何工作,但 tutorilas 工作,而我的应用程序不只是因为:只要我不调用 getAllProjects() 函数,projects1 变量就没有数据。 autoloadCallback 不会自动调用函数!?我在 LokiJS 项目上开了一个 Issue,问我做错了什么,或者这不是 autoloadCallback 的想法。
当我有一个完整的工作解决方案时,我会post在这里...