如何在AngularJS中仅调用一次函数作为初始化

时间:2014-07-26 13:31:34

标签: angularjs sqlite

我刚刚接触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

2 个答案:

答案 0 :(得分:1)

在您的plunker示例中,init()调用getLists()函数,该defaultResultHandler()调用resetForm(),调用init(),再次调用init()。因此无限循环。

要回答您的问题,您初始化数据的方式没有任何问题。我经常使用init()函数执行相同的操作。问题是,您通过在另一个函数中再次调用它来明确地破坏该模式,这使它不再是一次性初始化。

即使没有无限循环,这也是不好的设计IMO。如果您在初次加载后再次呼叫{{1}},则可能需要时间退后一步,思考您正在做什么以及为什么。

答案 1 :(得分:1)

init不会从控制器循环调用,而是从重置形式调用...

这就是循环的方式

  

init()=> getLists()=> promisedQuery()=> defaultResultHandler()=>   resetForm()=>的init()