Knockout Js function not appearing on page - javascript

I have a js file named admin.js which has knockout js functionality.
function AppViewModel() {
var self = this;
self.alldata = ko.observableArray();
self.viewAllInvoice = function() {
$.ajax({
type: 'POST',
url: BASEURL + 'index.php/main/learn_Ko/',
contentType: 'application/json; charset=utf-8'
})
.done(function(invoices) {
alert("hello");
self.alldata.removeAll();
$.each(invoices, function(index, invoice) {
self.alldata.push(invoice);
});
})
.fail(function(xhr, status, error) {
alert(status);
})
.always(function(data) {});
};
self.viewAllInvoice();
}
$(document).ready(function() {
ko.applyBindings(new AppViewModel(), document.getElementById('loanersclub_wrapper'));
});
I am trying to call the function in this page like this.
<script type="text/javascript" src="<?php echo base_url();?>js/admin.js" ></script>
<div style="margin-top:30px;" class="container" id="loanersclub_wrapper" class="wrapper">
<h1>HELLo</h1>
</div>
<div class="table-responsive">
<table class="table table-striped table-bordered table-condensed">
<thead>
<tr>
<th class="text-center">1</th>
<th class="text-center">2</th>
</tr>
</thead>
<tbody data-bind="foreach: alldata">
<tr>
<td class="text-center"><span data-bind="text: $data.Loantime "></span></td>
<td class="text-center"><span data-bind="text: $data.Amount"></span></td>
</tr>
</tbody>
</table>
</div>
The thing is that, I am getting this data from a controller since I am using php, and I checked the controller does get the information as arrays, but the js file is not getting any thing, I even tried using alert, but seems like the function self.viewAllInvoice is not getting called at all.

You either need to set the value of BASEURL to the base url of your website, or use a relative path in your ajax call:
$.ajax({
type: 'POST',
url: '/index.php/main/learn_Ko/',
contentType: 'application/json; charset=utf-8'
})

Related

How to reload / refresh the html table using jquery

Below I've added my full Index.cshtml code. In ajax call it's hitting to success method. but i'm not able to reload or refresh the table without page refresh.
The below code is simple while clicking the submit button for filters i'm calling SubmitFilter method it redirect to c# method there i'm storing the results in a JArray variable.. then trying to reload the table...
this is the sample output screen
I've tried these
$("#tblTransactions").DataTable().draw();
$("#tblTransactions").DataTable().ajax.reload();
But it's not working for me. please Let me know if you got any idea ..thanks in advance..
#page
#model IndexModel
#{
Layout = "_Layout";
}
<script>
$(document).ready(function () {
$("#tblTransactions").DataTable();
});
function SubmitFilter()
{
var transactionNumb = $("#transactionNumber").val();
var cardHolderName = $("#cardHolder").val();
alert("SubmitFilter");
$.ajax({
type: "GET",
url: "https://localhost:7197/Transactions?transaction_number="+transactionNumb+"&cardholder="+cardHolderName,
contentType: "application/json; charset=utf-8",
dataType: "html",
success: function (data)
{
}
});
}
</script>
<a style="max-width: 100px;max-height: 40px;margin-left: 10px;" href="#" onclick="SubmitFilter();" class="btn btn-primary">SUBMIT</a>
<table id="tblTransactions" class="table table-bordered table-condensed table-striped table-hover">
<thead>
<th scope="col">Transaction No</th>
<td scope="col">Type</td>
<td scope="col">Status</td>
</thead>
<tbody>
#foreach (dynamic transaction in #Model.Transactions)
{
<tr>
<td>#transaction.transaction_number</td>
<td>#transaction.type</td>
<td>#transaction.status</td>
</tr>
}
</tbody>
</table>

Make button in a table cell to change the color of the row it's in

I'm trying to add a class to the same row that the button I click on is in. I use the jquery "closest" function but it doesn't work. I also tried .parent etc. Anyone know what I do wrong?
<table class="table table-striped table-bordered table-hover">
<tbody class="">
<tr class=''> //I want to change this class
<td style=''><div class='btn btn-xs btn-success cellButton'></td>
</tr>
</tbody>
$('.cellButton').on('click', function(){
$(this).closest("tr").addClass('info')
}
EDIT: I realise now that the code I posted should work (I simplified it before posting), and the problem is because it's referencing $(this) from a different function. This is the real javascript function:
$('.cellButton').on('click', function(){
var formData = {
'action': 'blabla',
'ID': ID,
};
$.ajax({
type: 'POST',
url: 'includes/jquery-actions.php',
data: formData,
dataType: 'json',
error: function (response) {
alert("error!");
},
success: function (response) {
var row = $(this).parents("tr"); //$(this) here not referencing the HTML button?)
row.addClass('warning');
}
})
}
Your version is working. Also
you can use jQuery#parents function. Give it the selector, it will tries to find the closest one and return that element.
parents
$('.cellButton').on('click', function() {
$(this).parents("tr").addClass('info');
});
.info {
color: red
}
<script src="https://ajax.googleapis.com/ajax/libs/jquery/2.1.1/jquery.min.js"></script>
<table class="table table-striped table-bordered table-hover">
<tbody class="">
<tr class=''>
<td style=''><div class='btn btn-xs btn-success cellButton'>Click me</td>
</tr>
</tbody>
closest
$('.cellButton').on('click', function() {
$(this).closest("tr").addClass('info');
});
.info {
color: red
}
<script src="https://ajax.googleapis.com/ajax/libs/jquery/2.1.1/jquery.min.js"></script>
<table class="table table-striped table-bordered table-hover">
<tbody class="">
<tr class=''>
<td style=''><div class='btn btn-xs btn-success cellButton'>Click me</td>
</tr>
</tbody>
UPDATED
There is an issue with context.
You can keep your this in above the ajax request and use that variable inside the function
var that = this;
...
success: function (response) {
var row = $(that).parents("tr");
row.addClass('warning');
}
Or just use arrow functions
success: (response) => {
var row = $(this).parents("tr");
row.addClass('warning');
}

Paginator table not paging after Jquery ajax query

I'm using Twitter Bootstrap and I have a responsive table with paginator. In on load page, the pagination works, but after the Jquery Ajax event, which update the rows and data in the body table, the table do not is pagination.
Table:
<table id="tblFaltas" class="table table-striped table-bordered">
<thead id="theadFaltas">
<tr class="header">
<th rowspan="2">
Name
</th>
</tr>
<tr id="lnDia">
<th>
</th>
</tr>
</thead>
<tbody id="tBodyFaltas">
<tr>
<td>
<center>
No data
</center>
</td>
<td>
<center>
No data
</center>
</td>
</tr>
</tbody>
</table>
And a select button which call the Jquery ajax function.
Button with event onChange:
<select class="form-control" id="day" onChange="selectDay()">
<option>
</option>
</select>
Function selectDay():
function selectDay() {
$.ajax({
type: 'POST',
data: JSON.stringify(data),
cache: false,
contentType: 'application/json',
datatype: "json",
url: '/home/getdays',
success: function (returns) {
$('#tBodyFaltas').empty();
$('#tBodyFaltas').append($tr); // UPDATE THE BODY TABLE HERE
}
});
$('#tblFaltas').dataTable(); // Call the dataTable pagintator
};
My doubt is: $('#tblFaltas').dataTable(); works in this way?
You must reinitialise the dataTable completely after you have inserted new items :
function selectDay() {
$.ajax({
type: 'POST',
data: JSON.stringify(data),
cache: false,
contentType: 'application/json',
datatype: "json",
url: '/home/getdays',
success: function (returns) {
$('#tBodyFaltas').empty();
$('#tBodyFaltas').append($tr); // UPDATE THE BODY TABLE HERE
$('#tblFaltas').dataTable({
destroy : true
});
}
});
}
The destroy option let you reinitialise an existing dataTable instance (if any) without conflicts.

Updating multiple values in a scroller with javascript

I have a scroller in my page containing 10 static tables which I scroll using jquery-als anylistscroller. The problem is that my data source contains many objects so when I update the tables the only result I get is the last 10 elements from the data source. I tried using setTimeout function to delay the update of values but that didnt work and I could not add tables dynamically to the page.
here is example of the tables
<div id="lista2" class="als-container">
<div class="als-viewport">
<div class="als-wrapper">
<div class="als-item">
<table id="table" border="1">
<tr class="cla">
<th rowspan="2" id="01">
<img title="img1" id="img01" height="30" width="30" src="~/Images/orderedList0.png">
</th>
<th id="111">qte
</th>
<th id="112">var
</th>
</tr>
<tr>
<td id="121">prix
</td>
<td id="122">symb
</td>
</tr>
</table>
</div>
here where I update the values :
$.ajax({
type: "GET",
contentType: "application/json;charset=utf-8",
dataType: "json",
url: '#Url.Action("getTickerObjects", "Home")',
success: function (ListTicker)
{
for (var i = 0; i < ListTicker.ListTicker.length; i++)
{
var obj = ListTicker.ListTicker[i];
Update(c, obj.QteE.toString(), obj.Trade_Price.toString(), obj.Price_Trade_Variation.toString(), obj.Mnemonic.toString().trim());
}
},
error: function (xhr, ajaxOptions, thrownError) {
}
});
Is there a way I can slow down the updating process ?
You can try the defered attribute on an <script> tag that points to an external file. Try placing it before the closing </body> tag. Here' an article
<script src="script.js" defer="defer"></script>

ajax call not sending data correctly

There is something wrong with the way I am using the ajax call.
When I place the ajax call inside the block, it executes the error function in the ajax callback. When the ajax call is moved outside the block, the variable subcate passed to server is undefined.
var that = this;
var subCate ='' ;
var tr = $('#tbl').find('tr');
//My block
tr.bind('click', function(event) {
var values = '';
tr.removeClass('highlight');
var tds = $(this).addClass('highlight').find('td');
subCate = tds.find('#myid').text();
alert(subCate);
//Tried moving it out of the block but not much of help
$.ajax({
url: '/playground',
type: 'POST',
data: { id: subCate},
success: function(data){
alert("Sub category recvd");
console.log("successs");
},
error: function(jqXHR){
console.log("failed");
alert("failed");
}
});
});
//Ajax call moved here
Here is the node.js server code :
app.post('/playground', function(req, res) {
debug("Inside post(/playground) ",req.body.id);
res.send('ok', 200);
});
Hi Here is the snippet of HTML table, that will give an idea what the jquery code is doing
<div id="category-container">
<div id="category-form">
<h1></h1>
<p id="sub1" class="subheading">Select a category</p>
<!--hr-->
<div style="margin:20px" class="container">
<table id="tbl" class="table table-bordered table-striped">
<thead>
<tr>
<!--th(style='width:40px') #-->
<th style="width:180px">Name</th>
<th style="width:200px">Location</th>
<th style="width:180px">Username</th>
</tr>
</thead>
<tbody>
<tr>
<td>
<div id="myid"><a id="item" href="/playground/:0">Electronics</a></div>
</td>
</tr>
<tr>
<td>
<div id="myid"><a id="item" href="/playground/:1">Real Estate</a></div>
</td>
</tr>
</tbody>
</table>
</div>
</div>
</div>
Thanks in advance guys !
Add event.preventDefault() at the top of your bind.
Also, I recommend changing the event binding to the following:
$('#tbl').on('click', 'tr', function(event) {
event.preventDefault();
// your code
});

Categories

Resources