【问题标题】:Accessing function from within another with Javascript使用 Javascript 从另一个内部访问函数
【发布时间】:2013-08-27 12:39:07
【问题描述】:

我正在尝试让jquery loadmask 插件工作,它会屏蔽元素(用于加载内容)。我正在使用 knockout.js,如果我在我的视图模型之外屏蔽一个元素,它会起作用,但我想在提交 POST 请求时屏蔽它,然后在收到它时取消屏蔽。我从这里得到一个“对象没有方法掩码”错误。我不太确定如何设置一个对象来访问它。

这行得通,但这不是我想要的。我在代码中注意到我想从中调用掩码

<div id = "register_container">
    <div data-bind="visible: register()">
          <div id = "register_form"> <!--this is the div I want to mask -->>
              <button data-bind="click: submitRegistration">Submit</button>
          </div>
     </div>
</div>

function MyViewModel(){

     self.submitRegistration = function(){
           //I want to mask here. When I try it says Object[object object] has no method mask
            $.post....{
                if(data.result == success){
                     // andunmask here
                }
            }
      }
}

$("#register_form").mask("Waiting...");  //the masking works when I place it here, but it's always enabled and I want it inside the viewmodel where I noted so it only works when the POST request is in process

这很好,但我想从我注意到的视图模型内部屏蔽一些东西。我怎样才能做到这一点?

【问题讨论】:

    标签: javascript jquery mvvm knockout.js


    【解决方案1】:

    我发现有几件事可能是问题所在。

    首先,您正在执行分配而不是 if 语句中的比较。改用这个:

    if(data.result == success){
    

    甚至

    if(data.result === success){
    

    其次是我不太明白你的代码self.submitRegistration(){,它通常看起来更像这样:

    var MyViewModel = function () {
        var self = this;
    
        self.submitRegistration = function() {
        };
    };
    

    然后,如果我模拟 $.post 调用,它会像这样工作:

    var MyViewModel = function () {
        var self = this;
    
        self.register = ko.observable(true);
    
        self.submitRegistration = function() {
            $("#register_form").mask("Waiting...");
    
            // Mock $.post
            window.setTimeout(function () {
    
                if (1 == 1) {
                    // andunmask here
                    $("#register_form").unmask();
                }
            }, 3000);
        }
    };
    
    ko.applyBindings(new MyViewModel());    
    

    有关演示,请参阅 this fiddle

    您甚至可以让 Knockout 帮助您找到要查找的元素:

    请参阅 this updated fiddle 以获取演示。

        // Use the "event" parameter to find the element...
        self.submitRegistration = function(data, event) {
            $(event.target).closest('#register_form').mask("Waiting...");
    

    希望对你有帮助。

    【讨论】:

    • 谢谢你的建议,我去看看。视图模型只是伪代码,因此任何不准确之处都不算什么。我很快把它打了出来,这样我就不用在这里剪一百行代码了。
    • 嗯,如果你确保你的问题不是“快速输入”的伙伴,你会得到更好的帮助(和更快乐的志愿者),确保你发布的代码在语法上是好的。现在不得不经历它试图帮助你,而你知道这不太好:'(。不酷...
    • @Joroen 很抱歉,但我看不出这有什么改变。我有一些语法错误,但这并没有改变我尝试访问 mask() 函数的位置或方式。从功能的角度来看,是一样的。
    • @user1406951 我只是觉得你没有花时间创建一个整洁的复制品是不礼貌的,而只是明知让我们浪费我们的 时间解决它。
    猜你喜欢
    • 2014-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2023-03-23
    • 1970-01-01
    • 1970-01-01
    • 2021-01-22
    • 1970-01-01
    相关资源
    最近更新 更多