使用Javascript从另一个内部访问功能

时间:2013-08-24 15:28:19

标签: javascript jquery mvvm knockout.js

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

这有效,但这不是我想要的。我在代码中注意到我想从

中调用mask
<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

这很棒,但是我想在我注意到的视图模型中掩盖一些内容。我怎么能做到这一点?

1 个答案:

答案 0 :(得分:0)

我看到可能有问题的几件事。

首先,你在做作业而不是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...");

希望它有所帮助。