2014-10-16 103 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