处理一些反馈表,我是Knockout / jQuery游戏的新手,所以我确定这是一个语法错误。
HTML反馈表(UL列表)的相关部分:
<ul class="thumbnails" id="feedbackList">
<li class="feedbackItem" id="feedbackItemPraise" title="Praise" data-bind="click: updateFeedbackType"><i class="icon-thumbs-up"></i>Praise</li>
<li class="feedbackItem" id="feedbackItemCriticism" title="Criticism" data-bind="click: updateFeedbackType"><i class="icon-thumbs-down"></i>Criticism</li>
<li class="feedbackItem" id="feedbackItemProblem" title="Problem" data-bind="click: updateFeedbackType"><i class="icon-warning-sign"></i>Problem</li>
<li class="feedbackItem" id="feedbackItemQuestion" title="Question" data-bind="click: updateFeedbackType"><i class="icon-question-sign"></i>Question</li>
</ul>
到目前为止的ViewModel(包括一些不相关的部分):
var FeedbackViewModel = function () {
var self = this;
self.manualEMailAddress = "MyEmail@MyProvider.com";
self.manualApplicationName = "MyApplication";
self.username = ko.observable($("#feedbackUsernameFromServer").val());
self.feedbackType = ko.observable("Praise");
self.wantsFollowUp = ko.observable(true);
self.enteredName = ko.observable("");
self.feedbackText = ko.observable("");
self.userNameCaptured = ko.computed(function () { return self.username().length > 3; }, self);
self.mailToLink = ko.computed(function () { return "mailto:" + self.manualEMailAddress + "?subject=" + encodeURIComponent(self.feedbackType()) + encodeURIComponent(" for ") + encodeURIComponent(self.manualApplicationName) + "&body=" + encodeURIComponent(self.feedbackText()) }, self);
};
var feedbackViewModel = new FeedbackViewModel();
ko.applyBindings(feedbackViewModel, document.getElementById("feedbackModal"));
当前用于更改样式的jQuery(尚未链接到模型):
$("#feedbackList li").click(function () {
$("#feedbackList li.feedbackItem-Highlighted").removeClass("feedbackItem-Highlighted");
$(this).addClass("feedbackItem-Highlighted");
});
我认为我需要添加到ViewModel中,但不能正常工作:
self.updateFeedbackType = function (elementToChangeTo) {
self.feedbackType($(elementToChangeTo).attr("title"));
$("#feedbackList li.feedbackItem-Highlighted").removeClass("feedbackItem-Highlighted");
$(elementToChangeTo).addClass("feedbackItem-Highlighted");
};
这导致feedbackType变为未定义且未发生视觉变化。
我哪里错了?谢谢你的帮助!
答案 0 :(得分:2)
我认为你只需要在vm的定义中使用该功能。
这是一个似乎有用的jsfiddle:
更新:这是一个更好地利用淘汰赛并正确实现目标的小提琴:
答案 1 :(得分:1)
elementToChangeTo
返回FeedbackViewModel(与this
相同)而不是点击的元素 - 行为与jQuery略有不同。
传递给updateFeedbackType
的第二个参数将是一个事件,因此您可以使用$(event.target)
来获取对被点击元素的引用。
self.updateFeedbackType = function (view, event) {
var $elementToChangeTo = $(event.target);
self.feedbackType($elementToChangeTo.attr("title"));
$("#feedbackList li.feedbackItem-Highlighted").removeClass("feedbackItem-Highlighted");
$elementToChangeTo.addClass("feedbackItem-Highlighted");
};
然而,@ daedalus28已经解决了更大的问题,即你没有利用knockout.js的优势,并且使这个过程过于复杂。你真的不需要两者来解决这种简单的条件。