首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >对象不支持属性或方法“”save“”

对象不支持属性或方法“”save“”
EN

Stack Overflow用户
提问于 2013-05-16 01:17:39
回答 2查看 988关注 0票数 3

调用reportManager.save("/EditInitiatives.svc/SaveGridData");方法时出现错误

代码语言:javascript
复制
<script type='text/javascript'>
$(function () {
    $('#saveReport, #save-report-bottom').click(function () {
        $.blockUI({ message: '<h4><img src="/Images/busy.gif" /> Saving your changes.<br/>This operation might impact several reports at once.<br/>Please be patient.</h4>' });
        uiController.disableSaveButton();
        reportManager.save("/EditInitiatives.svc/SaveGridData");
    });

    var reportManager = function () {
        var tableData = JSON.stringify(handsontable.getData());
        var input = JSON.stringify({ "input": tableData });
        alert("Data" +  input); 

        save = function(saveUrl) { 
            alert("save" + saveUrl);

            $.ajax({
                url: saveUrl,
                type: 'POST',
                dataType: 'json',
                data: input, //returns all cells' data
                contentType: 'application/json; charset=utf-8',
                success: function(res) {
                    if (res.result === 'ok') {
                        console.text('Data saved');
                    }                        
                    $.unblockUI();                            
                }, 
                error: function (xhr) {
                    alert(xhr.responseText);
                }                       
            });
        }
    };
}
</script>
EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2013-05-16 01:18:46

您无法访问它,因为save是一个全局变量,不是reportManager的一部分。

之所以它是全局的,是因为变量前面缺少var。这将它放入全局命名空间中。它不会神奇地挂接到函数的块作用域。你需要使用一种面向对象的方法来让它工作。一些基本的想法是

代码语言:javascript
复制
function Report() {
     var x = 1;
    this.save = function () {
        alert("First: " + x);   
    }
}

var report = new Report();
report.save();


function report_2() {
     var x = 1;
    return {
        save : function () {
            alert("Second: " + x);   
        }
    }
}

var report2 = report_2();
report2.save();


var report_3 = (function () {
     var x = 1;

    var returnObj = {};
    returnObj.save = function () {
            alert("Third: " + x);   
    }

    return returnObj;


    //return {
    //    save  :  function() {
    //        alert("Third: " + x);   
    //    }
    //}
})();

report_3.save();

大量示例:http://jsfiddle.net/5Zhsq/

票数 3
EN

Stack Overflow用户

发布于 2013-05-16 01:25:16

您已经声明了不带var关键字的save函数;因此它将在全局范围内声明,而不是作为reportManager的函数声明。

即使您将var关键字放在save函数之前,也无法从reportManager函数scope外部访问它。要将其公开,您需要某种程度的export它。下面是一个执行此操作的简单模式:

代码语言:javascript
复制
 var reportManager = (function (self) {

      function save(saveUrl) { ... } //this function is not public yet

      self.save = save; //we are exporting the save function here
      return self; //now we are returning an object with save function

 })(reportManager || {});


 reportManager.save("your-param-here"); //Now use your function the way you want
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/16571224

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档