2017-09-13 7 views
-1

私はAngularJSを使ってテキストエリアにデフォルトのメッセージを表示しようとしています。追加しようとしている値の中には、値を取得するために$timeoutを使用する必要があります。 scope.apply機能を探し

<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

[文字領域内のデータバインド値をangleを使用して既定の既定メッセージとして挿入する]の可能な複製(https://stackoverflow.com/questions/46192941/insert-data-bind-values-inside-textarea-as-a-default -canned-message-using-angula) –

答えて

1

と(私は私からこれを書いている。このような何かを試してみてください。

メッセージは、以下のコードを使用してレンダリングしていないようですメモリは、)完全に機能することを期待していない:

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> 

編集:$タイムアウトが必要でないことを考慮してください。

Edit2:ReferalServiceを工場(angular.service vs angular.factory)として実装してみることをお勧めします。それはあなたのテンプレートにロジックの不必要な量を追加しますので、あなたはあなたのケースでngInitを使用して、データモデル

<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); 
1

は、良い習慣ではありません。

だけtextareaからng-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

$ timeoutを使用すると、非同期ロジックが中断されます。それは必要ではないし、私は物事を行う悪い方法のようになることは間違いない。次に、ng-modelを使用しないと、$ scope項目をsubmit関数のフォームとして送信するためにtextareaが役に立たなくなります。 – Fibman

1

からのコンテンツを表示するには{{}}を使用することができます

+0

私はそれが好きですが、非同期呼び出しが発生したときにメッセージが更新可能でない可能性があります。 $ scope。$ apply関数を使うと解決できるかもしれませんが、それは私の答えですが、buildMessage関数を保持しています。 – Fibman

+0

@Fibman '$ scope。$ apply'は、変更がanglejsスコープ外で発生し、それを呼び出すと' $ digest already in progress'エラーに繋がる可能性がある場合に必要です。 '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を使いました。私は$ applyがほとんど常に必要でした。 – Fibman

関連する問題