【问题标题】:Life Cylcle of Controller Objects in AngularJSAngularJS 中控制器对象的生命周期
【发布时间】:2017-05-27 14:01:30
【问题描述】:

我正在开发一个用 Ionic-1 编写的混合应用程序,它使用 Angular-1 javascript 库和 HTML-5 来创建混合应用程序。

在我的代码中,我连接到 Firebase 以获取一些数据:

我的Ctrl:

angular.module('myctrl.controller', [])
  .controller('MyCtrl', function () {
    $ionicPlatform.ready(function () {
      try {
            var userRef = firebase.database().ref().child("users/" + loggedInUser.userName + "/details");             
            userRef.on('child_added', function(snapshot, prevChildKey) {
              var newUser = snapshot.val();
              console.log("New user " + JSON.stringify(newUser));
          });
        }
     });
  });

现在,据我了解,每次重新创建附加到的视图时,都会重新实例化控制器。但是,在我的应用程序中,即使我在附加到此控制器的视图之外,并在 firebase 中添加一个用户,此代码也会被执行。这让我感到困惑,因为一旦视图被另一个视图替换,这段代码就应该被垃圾收集。这是否意味着这个on() 方法以某种方式附加到$rooScope

【问题讨论】:

    标签: javascript angularjs ajax ionic-framework firebase-realtime-database


    【解决方案1】:

    firebase 事件不会自动注销,您必须在离开控制器时手动注销它。

    var userRef;
    $ionicPlatform.ready(function () {
      try {
        userRef = firebase.database().ref().child("users/" + loggedInUser.userName + "/details");             
        userRef.on('child_added', function(snapshot, prevChildKey) {
          var newUser = snapshot.val();
          console.log("New user " + JSON.stringify(newUser));
        });
      }
    });
    
    $scope.$on('destroy', function() {
      if (userRef) userRef.off();
    })
    

    【讨论】:

    • 我明白了。谢谢你的回答。你知道这个userRef 是如何在控制器被销毁的情况下存活下来的吗?它不应该像我们在控制器中定义的任何其他变量一样消失吗?
    • @Richeek 不,这与userRef 变量无关,当您调用userRef.on 时,它将向浏览器的调度程序添加一个任务,除非您手动释放它,否则该任务不会被回收。
    • 谢谢!这让我安心了 :) 我之前尝试寻找 on() 方法文档,但我能找到的只是 jQuery on() 方法 [api.jquery.com/on/] 。是一样的吗?请问是否有任何文档可以让我了解这些事件处理程序的工作原理?
    • @Richeek 在此处查看文档。 firebase.google.com/docs/reference/js/…
    • @Richeek 看看这些是否有意义。 quora.com/…blog.risingstack.com/asynchronous-javascript
    猜你喜欢
    • 2013-04-12
    • 1970-01-01
    • 2016-11-21
    • 1970-01-01
    • 2010-12-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多