AngularJS - 为什么promise会触发控制器重新加载?

时间:2014-07-28 07:02:24

标签: angularjs angular-promise

我对AngularJS有疑问;这是我不理解的行为 - 也就是说,我曾经期待过一件事,但却得到了完全不同的东西。现在意外的行为可能是正确的,但我想了解它为什么会发生。

鉴于这个非常粗糙的代码(这是作为POC的实际代码):

angular.module('myApp')
  .factory('Promises', function ($q) {
    return {
      promises: function (val) {
        var d = $q.defer();

        setTimeout(function() {
          d.resolve(val);
        }, 1000);

        return d.promise;
      }
    };
  });

angular.module('myApp')
  .controller('MainCtrl', function (Promises) {
    console.log("Reload!");
    this.messages = this.messages || [ "hello" ];

    var that = this;
    this.scrappy = function() {
      console.log("Before: ", that.messages);

      Promises.promises(12).then(function(promise) {
        console.log("Fetching a promise", promise);
        that.messages.push("" + promise.toString());
        console.log("During: ", that.messages);
      }).finally(
        function(x) { console.log("Finaly: ", that.messages); }
      );
    };
  });

到目前为止一切顺利;我有一个冗长的函数,当我ng-click某个按钮时,会调用一个激活承诺的scrappy函数,一秒钟之后,列表会收到一个带有插入值的推送。

右?至少;那是我的推定......

结果发生了其他事情,我无法弄清楚原因,或者背后的原因是什么。

当我在浏览器中启动我的应用程序并单击按钮两次时;这就是console.log告诉我的:

# first hit
Reload! main.js:12
# now I click the button
Before:  ["hello"] main.js:17
Reload! main.js:12
Fetching a promise 12 main.js:20
During:  ["hello", "12"] main.js:22
Finaly:  ["hello", "12"] main.js:25
# now I click the button again
Before:  ["hello"] main.js:17
Reload! main.js:12
Fetching a promise 12 main.js:20
During:  ["hello", "12"] main.js:22
Finaly:  ["hello", "12"] main.js:25

这里最大的问题是:

  1. 为什么在承诺解析期间重新执行控制器功能?
  2. 我怎样才能阻止这种情况发生?
  3. [编辑]

    按要求; HTML(原样):

    <div class="jumbotron" ng-controller='MainCtrl as main'>
      <h1>'Allo, 'Allo!</h1>
      <p class="lead">
        <img src="images/yeoman.png" alt="I'm Yeoman"><br>
        Always a pleasure scaffolding your apps.
      </p>
      <p><a class="btn btn-lg btn-success" ng-href="#" ng-click="main.scrappy()">Splendid!<span class="glyphicon glyphicon-ok"></span></a></p>
    </div>
    

    BTW:这是使用routeProvider

    生成的yeoman

    [/编辑]

1 个答案:

答案 0 :(得分:0)

你的html中某个ng-controller='MainCtrl'ng-repeat可能有ng-include