我刚刚接触AngularJS并尝试使用sqlite创建一个小应用程序。 现在我能够插入记录,下一步是按索引删除它们。
正如我现在看到的那样,我似乎创建了一个无限循环,因为当我启动我的应用程序时,它会从数据库中获取所有记录进行初始化。 而这个init()给我带来了麻烦。
var listApp = angular.module('listApp', []);
listApp.controller('ListCtrl', ['$scope', '$q', function ($scope, $q) {
var deferred = $q.defer();
function init() {
// first - create the table
createTableIfNotExists();
getLists();
console.log("init loaded");
}
// some more functions
init();
}]);
所以我想要实现的是,当我的应用程序启动时,首先必须查看数据库中是否有任何记录,获取它们并在视图中呈现它。 所以这很好。但是现在当我将console.log(" init加载")添加到我的init()时,我看到init()作为循环运行。
因此,每次点击新按钮都无法启动,因为这个循环。
还有哪些其他方法可以从数据库中启动或获取一次数据来提供视图?到目前为止,我在AngularJS文档中搜索了我找不到可以调用控制器功能的函数,例如来自HTML模板。
修改 这是plunker。
编辑2: 这是新的plunker。
答案 0 :(得分:1)
在您的plunker示例中,init()
调用getLists()
函数,该defaultResultHandler()
调用resetForm()
,调用init()
,再次调用init()
。因此无限循环。
要回答您的问题,您初始化数据的方式没有任何问题。我经常使用init()
函数执行相同的操作。问题是,您通过在另一个函数中再次调用它来明确地破坏该模式,这使它不再是一次性初始化。
即使没有无限循环,这也是不好的设计IMO。如果您在初次加载后再次呼叫{{1}},则可能需要时间退后一步,思考您正在做什么以及为什么。
答案 1 :(得分:1)
init不会从控制器循环调用,而是从重置形式调用...
这就是循环的方式
init()=> getLists()=> promisedQuery()=> defaultResultHandler()=> resetForm()=>的init()