服务在AngularJS控制器中的承诺与语法

时间:2015-06-10 12:00:33

标签: javascript html angularjs

我遇到以下代码问题。我更喜欢控制器作为控制器语法并将数据分配给此而不是$scope.user。问题是它在下面的情况下不起作用,this.user的一切都很好,但$scope在模板中没有显示任何内容。我有什么不对或在这种情况下我需要使用angular.module('services', []) .factory('current_user', ['$http', '$q', function($http, $q){ var deferred = $q.defer(); $http.get('/api/user').success(function(data){ deferred.resolve(data); }); return deferred.promise; }]); angular.module('controllers', []) .controller('myUser', ['current_user', '$scope', function(current_user, $scope){ current_user.then(function(data){ this.user = data; #does not work $scope.user = data; #works fine }) }]); <div ng-controller="myUser as myUser"> <p>Current user: {{ user }}</p> <p>Current user: {{ myUser.user }}</p> </div> 吗?

$scope.val = parseFloat(($scope.val - 0.01).toFixed(2));

1 个答案:

答案 0 :(得分:1)

将回调传递给类似的函数时,无法保证上下文(即this)符合您的预期。在这种情况下,this可能指向Promise本身。

要解决此问题,您可以使用回调之外的var ctrl = this来捕获对控制器的引用:

angular.module('controllers', [])
    .controller('myUser', ['current_user', function(current_user){
        var ctrl = this;
        current_user.then(function(data){
            ctrl.user = data;
        });
    }]);

以上也是将属性附加到$scope的原因,因为在该上下文中它始终是对控制器的引用。

否则你可以使用bind强制你的承诺回调的上下文成为你的控制者:

angular.module('controllers', [])
    .controller('myUser', ['current_user', function(current_user){
        current_user.then(function(data){
            this.user = data;
        }.bind(this));
    }]);