0

我有一个关于 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); }
      );
    };
  });

到目前为止,一切都很好; 我有一个scrapy 函数,当我ng-click按下某个按钮时,会调用scrapy 函数,它会触发一个promise,一秒钟后列表会收到一个带有插入值的推送。

正确的?至少; 那是我的假设...

结果发生了其他事情,我不知道为什么,或者背后的原因是什么。

当我在浏览器中启动我的应用程序并单击按钮两次时;这是 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. 为什么在 promise resolve 期间会重新执行控制器功能?
  2. 我怎样才能阻止这种情况发生?

[编辑]

根据要求;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>

顺便说一句:这是 yeoman 生成的,使用routeProvider

[/编辑]

4

1 回答 1

0

您可能在htmlng-controller='MainCtrl'中的某个ng-repeat或某处ng-include

于 2014-07-28T07:05:52.253 回答