6
\$\begingroup\$

I want you to give me some tips on what I could have done better and is considered "bad practice". The code works, but I think there are better ways to do stuff, so please let me know.

var Artikel = Backbone.Model.extend({
    urlRoot: 'api/items.json',
    defaults: {
        titel: 'Titel niet opgegeven',
        url_titel: 'unieke sleutel urltitel',
        img_path: 'geen image toegevoegd',
        commentaar: 'Commentaar niet opgegeven',
        categorie: 'Categorie niet opgegeven',
        waardering: 0,
        artikel: 'Artikel niet opgegeven'
    },
    initialize: function() {
        if (!this.get('description')) {
            var lazy = 'This user was too lazy too add a description';
            this.set('description', lazy);
        }
    }
});
//Mijn collection wordt voorzien van een sorteerfunctie om niet met 'asc' en 'desc' te moeten werken kan ik gebruik maken van 1 en -1
var Artikels = Backbone.Collection.extend({
    model: Artikel,
    sortAttribute: "categorie",
    sortDirection: 1,
    sortArtikels: function(attr) {
        this.sortAttribute = attr;
        this.sort();
    },
    comparator: function(a, b) {
        var a = a.get(this.sortAttribute),
            b = b.get(this.sortAttribute);
        if (a == b) return 0;
        if (this.sortDirection == 1) {
            return a > b ? 1 : -1;
        } else {
            return a < b ? 1 : -1;
        }
    },
    url: 'api/items.json'
});
//Eerste view dat wordt weergegeven en geeft een lijst van al de artikels.
var ArtikelLijst = Backbone.View.extend({
    el: '#app',
    initialize: function() {
        _.bindAll(this, "render");
        this.model.bind('change', this.render);
    },
    render: function(zoekterm) {
        this.render;
        var that = this;
        artikels.fetch({
            success: function(artikels) {
                if (artikels.sortDirection == -1) {
                    artikels.sortDirection = 1;
                } else {
                    artikels.sortDirection = -1;
                }
                artikels.sortArtikels(zoekterm);
                var template = _.template($('#artikel-overzicht-template').html(), {
                    artikels: artikels.models
                });
                that.$el.html(template);
                return this;
            }
        });
    }
});
//Geeft een detail view van de artikels, in de detailweergave wordt de foto bijvoorbeeld weergegeven als extraatje
var ArtikelDetail = Backbone.View.extend({
    el: '#app',
    render: function(options) {
        var that = this;
        var artikel = new Artikels();
        url = options.id;
        artikel.fetch({
            success: function(artikel, options) {
                var vindartikel = artikel.where({
                    url_titel: url
                });
                var artikelcol = Backbone.Collection.extend({
                    model: Artikels
                });
                var specifiekArtikel = new artikelcol(vindartikel);
                var template = _.template($('#detail-edit-template').html(), {
                    specifiekArtikel: specifiekArtikel.models
                });
                that.$el.html(template);
            }
        });
    }
});
// de searchview geeft een formulier en zorgt er voor dat de zoekopdracht url-vriendelijk wordt
var ArtikelSearchView = Backbone.View.extend({
    el: '#app',
    render: function() {
        this.$el.html($("#search-form").html());
        if (arguments.length > 0) {
            var querystr = arguments[0].replace(/\+/g, "%20");
            $("#searchQuery").val(decodeURIComponent(querystr));
        }
    },
    events: {
        'submit #searchForm': function(ev) {
            $form = $(ev.currentTarget);
            document.location = '#/search/' + encodeURIComponent($("#searchQuery", $form).val()).replace(/%20/g, '+');
            return false;
        }
    }
});
//De resultsview laat de gevonden resultaten zien
var ArtikelSearchResultsView = Backbone.View.extend({
    el: '#searchResults',
    render: function(query_encoded) {
        var query = decodeURIComponent(query_encoded.replace(/\+/g, "%20"));
        var result_artikels = _.filter(this.model.models, function(artikel_model) {
            var artikel = artikel_model.attributes;
            artikel.waardering = "string";
            for (var key in artikel) {
                if (artikel[key].toLowerCase().indexOf(query.toLowerCase()) >= 0) {
                    return true;
                }
            }
            return false;
        });
        var template = $("#search-results").html();
        var result_html = _.template(template, {
            artikels: result_artikels,
            query: query
        });
        this.$el.html(result_html);
    }
});
var artikels = new Artikels();
var artikelLijst = new ArtikelLijst({
    model: Artikels
});
var artikelDetail = new ArtikelDetail();
var artikelSearchView = {};
artikelSearchView.search = new ArtikelSearchView();

function sorteer(sortterm) {
    artikelLijst.render(sortterm);
};
var Router = Backbone.Router.extend({
    routes: {
        "": "home",
        "detail/:id": "detail",
        "searchform": "searchform",
        "search/:query": "searchResults"
    },
    home: function() {
        artikelLijst.render('titel');
    },
    detail: function(id) {
        artikelDetail.render({
            id: id
        });
    },
    searchform: function() {
        artikelSearchView.search.render();
    },
    searchResults: function(query) {
        artikelSearchView.search.render(query);
        var artikelSearchResultsView = new ArtikelSearchResultsView({
            model: artikels
        });
        artikelSearchResultsView.render(query);
    }
});
var router = new Router();
Backbone.history.start();
\$\endgroup\$
1
  • 4
    \$\begingroup\$ Seriously, komaan man, don't put Dutch in your code, it makes us Dutch speaking developers look bad! \$\endgroup\$
    – konijn
    Commented Jan 22, 2014 at 23:55

1 Answer 1

3
\$\begingroup\$

I don't see major refactorings in your code. However:

  • Use triple-equals (see here for more) when doing comparisons with zero or one (and probably the part with a == b, unless you know you want otherwise)

  • Pre-compile templates rather than doing them on-the-fly for better performance

  • You are using Backbone, jQuery, and Underscore (or lodash) - re-examine whether you need all of these libraries. Less code means a faster loading page. (On the other hand, you might need the cross-browser compatibility provided by jQuery - your call.)

\$\endgroup\$

Your Answer

By clicking “Post Your Answer”, you agree to our terms of service and acknowledge you have read our privacy policy.

Not the answer you're looking for? Browse other questions tagged or ask your own question.