为什么这个knockout方法接收一个表单元素而不是嵌套在其中的对象?

lad*_*kie 2 javascript knockout.js

我有这个HTML:

<ul class="chat_list" data-bind="foreach: chats">
  <li>
    <div class="chat_response" data-bind="visible: CommentList().length == 0">
      <form data-bind="submit: $root.addComment">
        <input class="comment_field" placeholder="Comment…" 
          data-bind="value: NewCommentText" 
        />
      </form>
    </div>            
  </li>
</ul>
Run Code Online (Sandbox Code Playgroud)

这个JavaScript:

function ChatListViewModel(chats) {

   // var self = this;

    self.chats = ko.observableArray(ko.utils.arrayMap(chats, function (chat) {
        return { CourseItemDescription: chat.CourseItemDescription,
            CommentList: ko.observableArray(chat.CommentList),
            CourseItemID: chat.CourseItemID,
            UserName: chat.UserName,
            ChatGroupNumber: chat.ChatGroupNumber,
            ChatCount: chat.ChatCount,
            NewCommentText: ko.observable("")
        };
    }));

    self.newChatText = ko.observable();

    self.addComment = function (chat) {
        var newComment = { CourseItemDescription: chat.NewCommentText(),
            ParentCourseItemID: chat.CourseItemID,
            CourseID: $.CourseLogic.dataitem.CourseID,
            AccountID: $.CourseLogic.dataitem.AccountID,
            SystemObjectID: $.CourseLogic.dataitem.CommentSystemObjectID,
            SystemObjectName: "Comments",
            UserName: chat.UserName
        };
        chat.CommentList.push(newComment);
        chat.NewCommentText("");
    };
}
ko.applyBindings(new ChatListViewModel(initialData)); 
Run Code Online (Sandbox Code Playgroud)

当我进入调试器时,它显示函数的chat参数addComment()是表单元素而不是聊天对象.

为什么会这样?

Jos*_*osh 5

这是设计的.来自Knockout.js文档:

如此示例所示,KO将表单元素作为参数传递给提交处理函数.如果需要,可以忽略该参数,但是有关何时引用该元素有用的示例,请参阅ko.postJson实用程序的文档.

Serjio所述,您可以使用currying将其他参数传递给函数,或者您可以使用Knockout的Unobtrusive Event Handling,它允许您获取与表单元素关联的整个上下文.

self.addComment = function (form) {
    var context = ko.contextFor(form);
    var chat = context.$data;

    //rest of your method here
};
Run Code Online (Sandbox Code Playgroud)


Ser*_*kyi 5

因为KO的行为.要将聊天变量传递给提交处理程序,您可以使用:

<ul class="chat_list" data-bind="foreach: chats">
    <li>
        <div class="chat_response" data-bind="visible: CommentList().length == 0">
            <form data-bind="submit: function(form){$root.addComment($data, form)}">
                <input class="comment_field" placeholder="Comment…" data-bind="value: NewCommentText" />
            </form>
        </div>            
    </li>
</ul>
Run Code Online (Sandbox Code Playgroud)