使用angular指令可扩展聊天应用程序的文本区域字段
Expandable textarea field for chat app using angular directive
我正在使用angular/bootstrap,并有一个特定的指令,它可以作为我的应用程序的实际聊天输入框。我已经完成了更重要的扩展行为,只是我不太清楚如何在特定的。。。
这是小提琴
1) 我需要让回车键在文本区域内提交文本(使用表单的按钮是可选的,可以随意删除)。我在控制台中收到以下错误:"Uncaught ReferenceError:$未定义"(此处缺乏js结构的知识)。
2) 既然我使用的是angular,我应该在哪里包含自定义脚本?可能未在指令中的标记内内联。。。可能在controllers.js内部?最好的做法是什么?
3) 脚本this.form.sendThought();
中的ajax调用,能否从脚本中访问controllers.js?我想上面的#2需要在一个地方,这样我就可以访问这个功能。。。
这是指令:
<div class="clear" ng-show="allowInput">
<form role="form">
<div class="input-group">
<div class="textarea-container" id="txtCont">
<textarea ng-model="rawResponse"></textarea>
<div class="textarea-size"></div>
</div>
<span class="input-group-btn">
<button class="btn btn-lg" type="button" ng-click="sendThought()">send</button>
</span>
</div>
</form>
</div>
脚本:
var textContainer, textareaSize, input;
var autoSize = function () {
textareaSize.innerHTML = input.value + ''n';
};
document.addEventListener('DOMContentLoaded', function() {
textContainer = document.querySelector('.textarea-container');
textareaSize = textContainer.querySelector('.textarea-size');
input = textContainer.querySelector('textarea');
autoSize();
input.addEventListener('input', autoSize);
});
$('#txtCont').keydown(function() {
if (event.keyCode == 13) {
this.form.sendThought();
return false;
}
});
您没有包含jQuery($global对象在这里通常是指jQuery)。您可以包含jQuery,也可以使用vanillaJS来实现这一点。(更好的是,从Angular指令内部使用jqLite!)
以下是使用纯JS的keyup事件的样子。如果你想传递一个匿名函数,你不必像我一样命名函数。我更喜欢命名它们,这样我以后可以根据需要进行修改。(我也认为它更干净)
document.getElementById('chat').onkeyup = keyPressedChat;
http://jsfiddle.net/k0kyu5t7/
我很快就把这些放在一起,帮助你了解我在应用程序上下文之外使用香草JS的意思。
我第二次看它时注意到了更多的问题(除了不包括jQuery之外):
- 您应该监听textarea元素上的keydown事件,而不是父div。除非您特别指向文本区域,否则可能会捕获您可能不想要的keypress事件
- 您应该将事件传递到附加到处理程序的匿名函数回调中
你的第二个问题的答案太宽泛了,不适合在这里快速讨论。关于如何在Angular应用程序中组织文件,有很多固执己见的方法。我个人喜欢按组件分解,然后把它们放在这样的文件夹里。你的"聊天指令"可以存在于[Root]->[chat]->[Directives]->chat.js中。这只是一种方式。
至于你的#3,这取决于你在这里想要什么。您可以从指令中调用服务/工厂,无论如何,ajax调用都应该在这里。如果您希望指令更加模块化,那么一种选择可能是通过指令本身(通过视图)传递方法。
- onkeyup无法动态创建多个文本区域
- 具有所有样式的文本正在复制到可编辑文本区域
- 在文本区域POST后解码JSON
- 在文本区域中使用jQuery.text()保持换行符
- ng在下拉列表和文本区域提交
- 将文本插入光标所在的文本区域
- 离开页面导航后保留文本区域内容
- Javascript-在文本区域中断,但不在段落中中断
- 当选择值x时,Javascript需要在正确的位置显示文本区域,从而循环通过具有选择选项的表单
- 测试文本区域中的特定文本格式
- 文本编辑后,append函数不适用于文本区域
- 如何在ReactJs中链接下拉列表和文本区域
- I'我试图在文本区域中进行特定的输入,调用特定的javascript函数,但没有成功;不起作用
- 使用JSON文件中的变量(字符串)填充文本区域
- JavaScript-如果以前不存在文本,如何从文本区域删除新行
- 如何在php中创建一个函数,该函数与文本区域一起工作,通过输入类似[color:red]的内容来打印具有等效颜色的文本
- 如何为动态创建的文本区域中输入的值更新ng模型
- 延迟高亮显示文本区域中的文本
- 将字母添加到文本区域的末尾
- TinyMCE在新添加的文本区域