Created
November 4, 2016 17:44
-
-
Save dayvonjersen/07b2edceb8c39929c17f488fcced08e0 to your computer and use it in GitHub Desktop.
note to self on javascript mvc
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
<!doctype html> | |
<html> | |
<head> | |
<meta charset='utf-8'> | |
<title>Index</title> | |
</head> | |
<body> | |
<input type="text" placeholder="gtype suggest"> | |
<ul></ul> | |
<script src="model.js"></script> | |
<script> | |
var controller = new SearchController(); | |
SearchModel.register(SearchView); | |
</script> | |
</body> | |
</html> |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
function Subject() { | |
var observers = []; | |
return { | |
add: function(item) { | |
observers.push(item); | |
}, | |
removeAll: function() { | |
observers = []; | |
}, | |
notifyObservers: function() { | |
observers.forEach((o) => o.notify()); | |
} | |
} | |
}; | |
var SearchModel = { | |
subject: new Subject(), | |
query: "", | |
results: [], | |
/* advanced: filters, sort, etc... */ | |
search: function(query) { | |
query = encodeURIComponent(query); | |
/* check length, set additional parameters... */ | |
var xhr = new XMLHttpRequest(); | |
xhr.open("GET", "http://localhost/search?json&q="+query); | |
xhr.onreadystatechange = () => { | |
if(xhr.readyState == 4 && xhr.status == 200) { | |
this.query = query; | |
this.results = []; | |
var results = JSON.parse(xhr.responseText); | |
if(results.artists) { | |
results.artists.forEach((a) => this.results.push(a.name)); | |
} | |
if(results.tracks) { | |
results.tracks.forEach((t) => this.results.push(t.title)); | |
} | |
this.subject.notifyObservers(); | |
} | |
}; | |
xhr.send(); | |
}, | |
register: function(view) { | |
this.subject.removeAll(); | |
this.subject.add(view); | |
} | |
}; | |
var SearchView = { | |
listElement: document.querySelector('ul'), | |
_emptyTpl: () => '<em>No results.</em>', | |
_itemTpl: (result) => `<li>${result}</li>`, | |
notify: function() { | |
var html = ""; | |
if(SearchModel.results.length) { | |
SearchModel.results.forEach((result) => { | |
html += this._itemTpl(result); | |
}); | |
} else { | |
html = this._emptyTpl(); | |
} | |
this.listElement.innerHTML = html; | |
} | |
}; | |
var SearchController = function() { | |
var inputElement = document.querySelector('input'); | |
inputElement.oninput = () => SearchModel.search(inputElement.value.trim()); | |
}; |
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment