2013-05-15 4 views
3

Я получаю сообщение об ошибке при вызове метода reportManager.save("/EditInitiatives.svc/SaveGridData");Объект не поддерживает свойство или метод «Сохранить»

<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> 
+0

Функции are'nt автоматически связаны друг с другом, вам нужно определить его как 'this.save', а не глобальное, для этого? – adeneo

+1

Вам нужно разоблачить 'save' как доступный метод. add' return { 'save': save } 'в конце – karthikr

+0

@adeneo' save = 'находится в режиме reportManager справа? – James123

ответ

3

Вы не можете получить доступ к нему, так как save является глобальной переменной, а не часть reportManager.

Причина, по которой это глобально, заключается в том, что вам не хватает var перед переменной. Это помещает его в глобальное пространство имен. Он не будет волшебным образом подключен к области действия блока. Вам нужно будет использовать OO-подход, чтобы заставить его работать. Некоторые основные идеи

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(); 

Fiddle примеров: http://jsfiddle.net/5Zhsq/

+0

Я думаю, что это ?! –

+1

@MuhammadRamahy nope ... – epascarello

+0

лучше поместить сохранение в прототип этого класса, а не использовать this.save –

0

Вы объявили save функцию без var ключевого слова; поэтому он будет объявлен в глобальном масштабе не как функция от reportManager.

Даже если вы поставите var ключевое слово, прежде чем save функции, то она не доступна из-за пределов reportManager функции scope. чтобы разоблачить его публике, вам нужно любопытное export it. вот простой шаблон для этого:

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