【问题标题】:Promise in the template engine does not seem to work模板引擎中的承诺似乎不起作用
【发布时间】:2013-07-31 14:01:16
【问题描述】:

我正在尝试将 $scope 变量设置为 promise 并在模板引擎中使用该范围变量,但它似乎不起作用。

在控制器中:

  $scope.getUser = function() {
    // I am returning a promise
    // need this to be in a function so angular calls the function
    // more than once as the promise may change if a new user logs in,
    // i.e. myself is now someone new
    return UserService.getMyself();
  }

服务:

  var userDeferred = $q.defer();

  // Some other code here which resolves the promise.
  // I have verified that the promise does get resolved.      

  service.getMyself = function () {
    return userDeferred.promise;
  };

在html中:

 <button>
  {{getUser().username}} 
 </button>

我是从 angular 文档中读到的:

$q Promise 被 Angular 模板引擎识别,它 意味着在模板中,您可以将附加到范围的承诺视为 如果它们是结果值。

但我想我误解了这一点,我用错了。我有函数返回,因为用户可以更改(承诺更改)并且我希望我的模板引擎能够了解与承诺有关的事情已经改变的事实(即我在用户更改时创建了一个新的承诺并且我希望我的模板看那个。

编辑:

这是一个显示我想要达到的目的的 plunker: http://plnkr.co/edit/6J9pWY?p=preview

【问题讨论】:

  • 可能这个功能太多了,可以试试$scope.getUser = UserService.getMyself吗?
  • 是的,这也不起作用,不过是个好主意!
  • 另外 $scope.user = UserService.getMyself() 似乎也不适用于 {{user.username}}。
  • 显示 UserService.getMySelf() 中有什么
  • 使用 UserService.getMyself() 方法更新问题

标签: angularjs


【解决方案1】:

我不确定什么不适合您(您没有提供足够的信息),但这里有一个似乎有效的示例代码:

http://embed.plnkr.co/Ve5KV8m1UbVHeAtpTjFK/preview

Javascript

angular.module('myModule', [])
  .factory('UserService', function($q, $timeout) {

    var getMyself = function() {
      var userDeferred = $q.defer();

      $timeout(function() {
        userDeferred.resolve({username: 'root'});
      }, 2000);

      return userDeferred.promise;
    };

    return {
      getMyself: getMyself
    };
  })

  .controller('HelloCtrl', function($scope, UserService) {
      $scope.user = UserService.getMyself();
  });

HTML

  <body ng-app="myModule" ng-controller="HelloCtrl">
    <h1>User:</h1>
    {{user.username}}
  </body>

【讨论】:

  • 当然可以,但我希望用户从控制器返回一个函数,以便 Angular 不止一次地重新评估它。 IE。如果我的用户注销并且新用户登录怎么办。在这种情况下,您 $scope.user = UserService.getMyself() 已经被评估并且永远不会改变。我在 UserController 中发表评论希望澄清。
  • 当你这样做时,它会一次又一次地调用该函数。我不知道为什么。或许与观察者有关。在函数中插入console.log 语句,你会看到。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2021-09-25
  • 2023-01-02
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2016-04-05
  • 1970-01-01
相关资源
最近更新 更多