2014-10-16 41 views
1

在我的應用程序中,用戶可以選擇發送確認消息。此消息是預先生成的默認值(取決於其他上下文),但應由用戶編輯。AngularJS:從模板設置textarea的值

在angularJS中,意圖是預生成的消息來自模板。因此,例如我會有Msg1.html和Msg2.html,其中每個都包含MsgCommon.html(推測使用ng-include)。然後將結果文件插入到當前範圍中,以提供預生成消息的文本版本,我可能會將其放在textarea中。

但我還沒有找到如何做到這一點與angularJS。 AngularJS沒有正確處理內容,所以我不能在其中加入ng-include。大概在textarea上應該有一個ng模型,所以我需要在處理模板後在我的控制器中初始化模型元素。下面幾乎工程:

$http.get('msg1.html', {cache: $templateCache}).then(function(resp) { 
    $scope.msg = $interpolate(resp.data)($scope); 
}); 

in html: 
<textarea ng-model='msg'></textarea> 

這正確插值串像{{...}},但不會像處理NG-重複或指令NG-包括。我想我需要使用某種形式的$ compile,但是這需要一個DOM字符串或元素,而我的消息不是HTML。

任何想法如何做到這一點?

+0

你能展現出更多關於這個的代碼嗎?什麼叫'$ http。$ get'? – 2014-10-16 17:11:38

+0

爲什麼你想在你的消息中使用指令?正如你寫的,你的消息是純文本的,所以你不會有任何DOM節點來附加像ng-repeat這樣的指令。 – 2014-10-16 17:24:02

+0

該消息是確認客戶購買了多種產品。除此之外,我們想列出產品... – manuBriot 2014-10-16 18:16:07

回答

2

此解決方案僅用於演示目的。我不建議在真實世界的場景中使用它。我認爲最好只使用$interpolate並在您的控制器中創建必要的邏輯權限。 (即不是使用ng-repeat的,你可以在你的控制器串連你的清單,內插此字符串)

這個醜陋的解決方案的想法是編譯模板和元素的使用innerText只獲取純文本( Plunker):

$templateRequest('msg1.html').then(function(resp) { 
    var el = angular.element('<div></div>'); 
    var templateScope = $scope.$new(); 

    templateScope.name = 'Foo' 

    templateScope.tasks = ['t1', 't2', 't3', 't4']; 

    el.html(resp); 
    $compile(el.contents())(templateScope); 

    setTimeout(function(){ 
    $scope.msg = el[0].innerText; 
    $scope.$apply(); 
    }, 10); 
}); 
+0

我同意將邏輯放在控制器中。但在這種情況下,可能的消息模板由非程序員的第三方編輯,所以我寧願他們自己編輯模板。我會測試你的解決方案,至少現在我喜歡這個想法。這是一個我正在移植到angularJS的站點,我們可以在某些時候對其進行修改以消除對黑客的需求。謝謝 ! – manuBriot 2014-10-16 18:15:27