如何使用AngularJS在$ timeout内使用$ scope?

时间:2017-09-13 09:37:23

标签: javascript angularjs

我尝试使用AngularJS在textarea上呈现默认消息。我尝试添加的某些值需要使用$timeout才能获取值。

使用以下代码似乎无法呈现消息:

    <textarea class="text-input referral-message" ng-init="message=buildMessage(purchase_count)" 
              ng-model="message" rows="5">
    </textarea>
$timeout(function() {

    ReferralService.settings().$promise.then(function(settings) {
        $scope.purchase_count = settings.credits;
    });

    $scope.buildMessage = function(val){
      return "Buy " + val + " and get 1 free for every purchase"
    }
}, 1);

3 个答案:

答案 0 :(得分:1)

寻找scope.apply函数并尝试这样的事情(我是从我的记忆中写下来的,不要期望它完全正常运行):

ReferralService.settings().$promise.then(function(settings) {
  $scope.$apply(function(){
     $scope.message = "Buy " + settings.credits + " and get 1 free for every purchase";
  });
});

<textarea class="text-input referral-message" ng-model="message" rows="5">
</textarea>

编辑:考虑到$ timeout可能没有必要。

Edit2:看看将ReferalService作为工厂实施(angular.service vs angular.factory)我也可以帮助你。

答案 1 :(得分:1)

您可以使用{{}}显示数据模型中的内容

<textarea class="text-input referral-message" rows="5">{{message}}
</textarea>

$timeout(function() {

ReferralService.settings().$promise.then(function(settings) {
    $scope.purchase_count = settings.credits;
    $scope.message = "Buy " + $scope.purchase_count + " and get 1 free for every purchase"
});

}, 1);

答案 2 :(得分:1)

在您的情况下使用ngInit不是一个好习惯,因为它会在您的模板中添加不必要的逻辑。

只需从ng-init中删除textarea,并在解决承诺时初始化您的message变量:

ReferralService.settings().$promise.then(function (settings) {
    $scope.message = buildMessage(settings.credits);
});

function buildMessage(val) {
    return "Buy " + val + " and get 1 free for every purchase"
}