我正在使用Knockout.js来构建客户端视图模型。在我的视图模型中,我想公开一些可以绑定到页面中元素的函数(典型的MVVM模型)。我只希望响应来自按钮的单击事件来调用这些函数,但是在构建视图模型时调用它们...
我已经定义了我的模型:
<script type="text/javascript">
var ViewModel = function(initialData) {
var self = this;
self.id = initialData;
self.isSubscribed = ko.observable(false);
self.name = ko.observable();
self.SubscribeToCategory = function () {
$.ajax({
url: '@Url.Action("Subscribe", "Category")',
type: 'POST',
data: {
categoryId: self.id
},
success: function () {
self.isSubscribed(true);
},
failure: function () {
self.isSubscribed(false);
}
});
alert('Subscribing...');
};
self.UnsubscribeFromCategory = function () {
$.ajax({
url: '@Url.Action("Unsubscribe", "Category")',
type: 'POST',
data: {
categoryId: self.id
},
success: function () {
self.isSubscribed(false);
},
failure: function () {
self.isSubscribed(true);
}
});
alert('Unsubscribing...');
};
self.LoadCategory = function () {
$.ajax({
url: '@Url.Action("GetCategory", "Category")',
type: 'POST',
async: true,
data: {
categoryId: self.id
},
dataType: 'json',
success: function (data) {
self.isSubscribed(data.IsSubscribed);
self.name(data.Name);
}
});
};
self.LoadCategory();
};
$(document).ready(function () {
var data = '@Model';
var viewModel = new ViewModel(data);
ko.applyBindings(viewModel);
});
但是当我执行代码时,这两个警报会自动触发,但我不希望它们发生。我使用的是ASP MVC4,使用视图模型的HTML如下:
<p>
ID: <span data-bind="text: id"></span>
</p>
<div id="subscribe" data-bind="visible: isSubscribed == false">
<button data-bind="click: SubscribeToCategory()">Subscribe</button>
</div>
<div id="unsubscribe" data-bind="visible: isSubscribed == true">
<button data-bind="click: UnsubscribeFromCategory()">Unsubscribe</button>
</div>
<div>
Category Name: <span data-bind="text: name"></span>
Is Subscribed: <span data-bind="text: isSubscribed"></span>
</div>
我已经浏览了在线教程和其他一些淘汰样本,以及我使用淘汰赛的代码中的其他地方,但我不明白为什么这两个函数(SubscribeToCategory和UnsubscribeFromCategory)在文档加载时触发。
答案 0 :(得分:23)
我花了一秒钟,但结果却是一个简单的修复。从data-bind =“click:SubscribeToCategory()”中删除()并使你点击处理程序这个data-bind =“click:SubscribeToCategory”和data-bind =“click:UnsubscribeFromCategory”
答案 1 :(得分:5)
似乎绑定<button data-bind="click: SubscribeToCategory()">Subscribe</button>
中函数名称中的括号是问题。
()不应该在那里。所以看起来应该是这样的:
<button data-bind="click: SubscribeToCategory">Subscribe</button>