I’ve noticed a diffrence in the result between when I set a filter and sort via the DataSet object in the Wix Editor ans when I set them in Wix Code.
When I set the Sort and Filter on the object in the Wix Editor the filter and sort is applied to the returned items immediatly on page load.
When I set the Sort and Filter in Wix Code, and load the page, everything is returned intially, and after a second or so I see the filter and sort being applied. It could be that i’m not following best practice in my code?
I suggest hiding the table until filtering and sorting is done.
both filtering and sorting return promises so its fairly easy to wait for both to finish.
Hi Moshe, great suggestion. I had thought about doing this also, however, this adds delays to displaying content that isn’t needed when setting the sort and filter on the dataset object in the editor.
I would love a solution to this issue that doesn’t require hiding elements until the sort and and filter returns, at least, I don’t feel I should have to do this as the developer.
But if this is the only approach I guess i’ll have to go this way.
Hi! I am having the same problem with my site - I have the dataset filtered on some values using the dataset object ui, but I need to filter by date which is only possible in code.
Were you able to come up with a good solution to this?
Is there no way to filter the dataset with code before the page loads “on ready”?
The alternative is coding a “loading” icon and hiding the repeaters until the dataset is filtered? Any tips on how to do this without slowing down the page even more?
No, I didn’t come up with a suitable solution. I feel having to show a loading icon or hiding elements leads to poor UX and probably page bounce. I ended up ditching dynamic pages and setting the sort and filter on the dataset objects via the editor. Efficiency dividend lost, but at least it’s a better user experience.
It could be that setting the sort and filter in $w.onReady isn’t the right place, but since nobody from Wix responded, I can only guess…
I actually found a workable solution. I removed the DataSet element which was created through the editor and included the initial connection in the code. So now it won’t do a query unless I call the function in my code.
import wixData from 'wix-data';
function query() {
let query = wixData.query("CollectionName")
query = query.limit(50);
//put here all your query criteria
query.find()
.then( (results) => {
$w("#repeater1").data = results.items;
}
}
@jamie You are welcome. Maybe good to mention that I defined my query using “let query =” because I don’t always filter on the same items so I have some if statements included. In the example below I don’t query on when a store is open if the user selected “all” in the day drop-down.
import wixData from 'wix-data';
function query() {
let query = wixData.query("CollectionName")
query = query.limit(50);
if(daySelected !== 'all') { query = query.hasSome("daysOpen", daySelected); }
//put here additional query criteria
query.find()
.then( (results) => {
$w("#repeater1").data = results.items;
}
}
If you don’t have that kind of needs then you could do it easier like this for your example:
import wixData from 'wix-data';
function query() {
wixData.query("CollectionName")
.eq("published", true)
.ascending("pubdate")
//put here additional query criteria
.find()
.then( (results) => {
$w("#repeater1").data = results.items;
});
}
Erik,
Question 1 : Where do you put your code if you want your repeater or table filled at page opening ?
Question 2 : Removing the dataset in the editor does also remove the relationship between columns and collection fields. So I guess you have to build this relationship somehow (if you use a table at least, as I do), or does the query result array simply fill in the table columns, if they are in the same order ?
@erx214 Thank you for this update, I’m a musician with a bit of coding background but totally newbie with Wix Code, having a Collection of concerts, my goal is to split views, history and next shows. I already managed to set the filter but as @Jamie points I get first the whole list (200) and then the filter by date now() hide correctly the greater or low shows by date. I’ve tried to implement your solution but I get an error that I can only interact with a dataset already declared in the editor.
import wixData from 'wix-data';
let n = new Date();
function myquery() {
let query = wixData.query("datasetConcert")
query = query.limit(3);
//put here all your query criteria
query.find()
.gt("fecha", n)
.then( (results) => {
$w("#repeater1").data = results.items;
});
}
$w.onReady(function () {
// I commented that to test your solution
// $w("#datasetConcert").setFilter(wixData.filter()
// .gt("fecha", n)
// )
$w("#datasetConcert").onReady( () => {
myquery();
} );
});
I get the error even if I didn’t delete the #datasetConcert from the editor.
I would greatly appreciate a full working example, many thanks in advance.