【问题标题】:Call knockout js function调用敲除js函数
【发布时间】:2013-06-26 11:57:36
【问题描述】:

我有一个具有“getProgramDetails”函数的 KnockoutJS 模型,它在下拉列表更改事件时被调用:

data-bind = "value: programId, event: {change: getProgramDetails}"

这很好用,但是在我传入默认程序 ID 1 后,如何在页面加载时调用此函数?如果 programId 属性发生变化,有没有办法调用函数?而不是通过下拉列表的更改事件调用该函数。这可能会有所帮助。

这是我的模型:

<script type="text/javascript">
var UploadModel = function (programId) {
    var self = this;
    self.programId = ko.observable(programId);
    self.fileType = ko.observable();
    self.fileTypes = ko.observableArray();
    self.getProgramDetails = function () {
        if (self.programId() > 0) {
            // get program budget level and file types
            $.ajax({
                url: '@Url.Action("GetProgramDetails", "FileLoader")', 
                data: 'programId=' + self.programId(),
                dataType: 'json', 
                contentType: 'application/json; charset=utf-8',
                success: function (data) {
                    $('#budget-level').html(data.BudgetBalance);
                    var jsonFileTypes = data.FileTypes;

                    // add default option
                    jsonFileTypes.unshift({ 'Id': '', 'Name': '-- Select One --' });
                    self.fileTypes(jsonFileTypes);

                    $('.allow-upload').fadeIn();
                }
            });

        } else {
            $('.allow-upload').hide();
        }
    };
};

ko.applyBindings(new UploadModel('1'), $('#container-upload')[0]);
</script>

【问题讨论】:

    标签: knockout.js


    【解决方案1】:

    是的。要在 observable 发生变化时调用函数,请使用 subscribe

    self.programId.subscribe(function (newValue) {
        alert('Program ID is now:' + newValue);
    }, self);
    

    这一直记录在this page of the docs 的底部。

    然而,我发现subscribe 不会在初始页面加载时触发,即使您初始化了 observable。你仍然需要做这样的事情:

    var UploadModel = ...;
    var theViewModel = new UploadModel('1');
    ko.applyBindings(viewModel, $('#container-upload')[0]);
    theViewModel.getProgramDetails();
    

    【讨论】:

    • 你需要调用订阅函数来添加一个新的监听器,而不是重新定义它。
    • 是的,很抱歉。我搞砸了。
    • 嘿,没问题!您可能还想查看@Gordon 的答案。我喜欢它,因为它更干净,而且似乎是达到相同目的的推荐方式。
    • 谢谢,我想你的意思是@Nathan 我是 Gordon :)
    • 是的,对不起!我是说内森。
    【解决方案2】:

    如果您想手动订阅示例中的 programId 之类的属性,并且还希望它立即触发,您可以使用敲除计算 observable。

    计算出的 observable 立即计算,并且每次它的任何一个依赖项发生变化。

    一个鲜为人知的事实是,Knockout 甚至支持匿名计算 observables,这对于这种情况非常有用。

    var UploadModel = function (programId) {
      self.programId = ko.observable(programId);
      ...
    
      ko.computed(function(){
        // register programId as a dependency
        self.programId() 
        // execute the function you need to call
        self.getProgramDetails(); 
      });
    };
    

    Knockout Computed Docs

    【讨论】:

    • 哇,太酷了。我不知道那件事。我想我更喜欢你的回答。我做了一个简单的 jsFiddle 来使用控制台对其进行测试:jsfiddle.net/GQzPf.
    猜你喜欢
    • 2013-06-23
    • 1970-01-01
    • 2015-12-11
    • 2015-10-09
    • 2013-03-12
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-04-09
    相关资源
    最近更新 更多