javascript - Knockout JS:在 foreach 绑定中添加表单
问题描述
我想添加一个“删除评论”按钮作为一种表单,该表单在使用淘汰赛的 foreach 绑定生成的每个评论旁边触发一个 ajax 请求。comments
是一个可观察的数组,每个评论都是一个带有username
、text
和成员timestamp
的对象。commentID
在没有元素的情况下加载以下<form>
内容可以正常工作:
<ul data-bind="foreach: comments">
<li>
<span data-bind="text: username"></span>
<ul>
<li data-bind="text: text"></li>
<li data-bind="text: timestamp"></li>
<form data-bind="if: sameUser" method="post" action="deleteComment.php">
<input data-bind="attr: {id: commentID}, click: deleteComment" type="submit" value="Delete comment">
</form>
</ul>
</li>
</ul>
但是,包含一个<form>
元素会破坏 foreach 循环,只会加载一个注释。
我想使用if: sameUser
数据绑定,以便删除按钮仅对发布评论的用户可见,并且
attr: {id: commentID}
数据绑定发送正确的评论 ID 以在单击按钮时删除到服务器,但现在我的主要关注的是首先加载表单/按钮。
解决这个问题的正确方法是什么?
解决方案
不确定您是在评论级别或其列表级别编写删除函数,但如果正在绑定该函数,请使用$parent退出 foreach 上下文。
以下是工作示例
function viewModel() {
var self = this;
self.comments = ko.observableArray([]);
self.isDataLoaded = ko.observable(false);
self.loadData = function(){
setTimeout(function(){
self.comments.push({username:"A", sameUser:true, commentID:1, text:"This is comment from A"});
self.comments.push({username:"B", sameUser:true, commentID:2, text:"This is comment from B"});
self.comments.push({username:"C", sameUser:false, commentID:3, text:"This is comment from C"});
self.comments.push({username:"D", sameUser:true, commentID:4, text:"This is comment from D"});
self.isDataLoaded(true);
}, 2000);
}
self.deleteComment = function(data){
self.comments.remove(data);
}
}
var vm = new viewModel();
vm.loadData();
ko.applyBindings(vm);
<script src="https://cdnjs.cloudflare.com/ajax/libs/knockout/3.4.2/knockout-min.js"></script>
<script src="https://cdnjs.cloudflare.com/ajax/libs/jquery/3.3.1/jquery.min.js"></script>
<ul data-bind="foreach: comments">
<li>
<span data-bind="text: username"></span>
<ul>
<li data-bind="text: text"></li>
<!--<li data-bind="text: timestamp"></li> -->
<form data-bind="if: sameUser" method="post">
<input data-bind="attr: {id: commentID}, click: $parent.deleteComment" type="submit" value="Delete comment">
</form>
</ul>
</li>
</ul>
推荐阅读
- javascript - 布尔列表功能的困难
- java - 如何从 ImageView 获取图像并将其转换为字节数组以插入 MySQL DB 并从数据库中检索
- javascript - 如何让浏览器在新选项卡中打开 pdf 而不仅仅是下载它?
- java - JUnit:使用注入的 EJB bean 测试 Jersey REST 资源
- sql - 当一列具有更多值时,将 substr 和 instr 与连接一起使用
- javascript - 带有素数检查的三角形中的Javascript最大路径总和
- codeigniter-3 - 如何将 $id 从视图传递到 codeigniter 中的控制器。?
- c++ - 在类外设置 const int 成员变量(C++)
- php - pdo 参数是整数,附加小数到它
- c# - 如何从我的属性中获取两个值以返回到我的 main 方法?