Knockout JS在加载时调用函数

Aid*_*dos 15 javascript function viewmodel knockout.js

我正在使用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);
});
Run Code Online (Sandbox Code Playgroud)

但是,当我执行代码时,这两个警报会自动触发,但我不希望它们发生.我正在使用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>
Run Code Online (Sandbox Code Playgroud)

我已经浏览了在线教程和其他一些淘汰样本,以及我使用淘汰赛的代码中的其他地方,但我不明白为什么这两个函数(SubscribeToCategory和UnsubscribeFromCategory)在文档加载时触发.

小智 23

的jsfiddle

它花了我一秒钟,但结果是一个简单的修复.从data-bind ="click:SubscribeToCategory()"中删除()并使你点击处理程序这个data-bind ="click:SubscribeToCategory"和data-bind ="click:UnsubscribeFromCategory"

  • 如果你需要一个带参数的函数调用?比如:`data-bind ="click:SucscribeToCategory(25)"` (4认同)
  • 您可以将`bind`函数用于您自己的函数.在你的例子中@Wrench它是这样的:`data-bind ="click:SucscribeToCategory.bind($ data,25)"` (3认同)
  • 看起来你在我做的同时得到了答案.谢谢! (2认同)

Aid*_*dos 5

似乎绑定中函数名称中的括号<button data-bind="click: SubscribeToCategory()">Subscribe</button>是问题.

()不应该在那里.所以看起来应该是这样的:

<button data-bind="click: SubscribeToCategory">Subscribe</button>
Run Code Online (Sandbox Code Playgroud)

  • 如何传递参数? (2认同)