2017-09-13 33 views
-1

我想使用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); 
+1

什么,目的是在$超时服务?为了等待当前事件队列清除,偶尔需要设置超时值0(或1,我猜想),但是在您的示例中我没有看到任何可以强制实现的事件。 –

+0

[将textarea中的数据绑定值插入为使用角度的默认预设消息]的可能副本(https://stackoverflow.com/questions/46192941/insert-data-bind-values-inside-textarea-as-a-default -canned-message-using-angula) –

回答

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> 

编辑:考虑到$超时可能不是必要的。

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

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); 
+0

使用$超时断开异步逻辑。这不是必需的,我很确定这是一种不好的做事方式。然后,不使用ng-model使得textarea无用于在提交函数中将$ scope作为一个表单发送,这可能是这里的要点。 – Fibman

1

在你的情况下使用ngInit显示的内容是不是一个好的做法,因为它增加了逻辑的不必要的金额到您的模板。

只需删除从textareang-init和初始化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" 
} 
+0

我喜欢这一点,但是当发生异步呼叫时,消息可能不可更新。使用$ scope。$ apply函数可以解决这个问题,它驱动到我的答案,但保留了buildMessage函数。 – Fibman

+0

@Fibman'$ scope。$ apply'是需要的,如果更改发生在angularjs范围之外并且调用它可能导致'$ digest已在进行中'erros;如果'ReferralService'使用['$ resource'](https://docs.angularjs.org/api/ngResource/service/$resource)或['$ http']](https://docs.angularjs.org/ api/ng/service/$ http)(我假设是这样),那么不需要'$ apply',因为处理程序是在$ apply块的上下文中调用的。它依赖于'ReferralService'实现。但是无论如何,我看到作者在他以前的帖子中也提到过相同的东西,所以最好将其标记为“笨蛋”。 –

+0

这个解释很清楚。 我用angular.factory,我几乎总是需要$应用。 – Fibman

相关问题