patternjavascriptMinor
toggleSaveStream button template
Viewed 0 times
templatetogglesavestreambutton
Problem
I've got a view which has a corresponding template. The template looks something like like:
I've passed into the template some variables such as
Now, the state of
So, I wrote the following:
Which serves to keep my button up to date.
I'm unhappy with this solution because the logic for the disabled state of the button is duplicated into two spots. Is this a valid concern? How to handle?
Button is rendered disabled in template and I don't want to re-render whole template to change button state. How to stay DRY?
" title="">
" >
I've passed into the template some variables such as
userLoaded. This allows me to render the initial state of the saveStream button.Now, the state of
userLoaded has changed and I would like to update the button. I don't want to render my entire template again because streamItems is an expensive list to render.So, I wrote the following:
initialize: function() {
this.listenTo(User, 'change:loaded', this.toggleSaveStream);
},
toggleSaveStream: function () {
var userLoaded = User.get('loaded');
var templateHelpers = this.templateHelpers();
this.ui.saveStreamButton.toggleClass('disabled', userLoaded);
this.ui.saveStreamButton.attr('title', userLoaded ? templateHelpers.saveStreamMessage : templateHelpers.cantSaveNotSignedInMessage);
}Which serves to keep my button up to date.
I'm unhappy with this solution because the logic for the disabled state of the button is duplicated into two spots. Is this a valid concern? How to handle?
Button is rendered disabled in template and I don't want to re-render whole template to change button state. How to stay DRY?
Solution
From looking at it, the name of your function
Since it does that, you could call it at first, de-activating the button, and then once the user is loaded call it again.
Then you would simply have
And then
This sounds too easy, so feel free to point what I am missing ;)
toggleSaveStream is lying, calling it twice will not make it toggle, it will look at the the status of the user and set the status accordingly. So I would simply call it updateSaveStreamButton.Since it does that, you could call it at first, de-activating the button, and then once the user is loaded call it again.
Then you would simply have
" title="">And then
initialize: function() {
this.updateSaveStreamButton();
this.listenTo(User, 'change:loaded', this.updateSaveStreamButton);
},
updateSaveStreamButton: function () {
var userLoaded = User.get('loaded');
var templateHelpers = this.templateHelpers();
this.ui.saveStreamButton.toggleClass('disabled', userLoaded);
this.ui.saveSelectedButton.attr('title', userLoaded ? templateHelpers.saveStreamMessage : templateHelpers.cantSaveNotSignedInMessage);
}This sounds too easy, so feel free to point what I am missing ;)
Code Snippets
<button id="saveStream" class="button-icon button-small save disabled>" title="">initialize: function() {
this.updateSaveStreamButton();
this.listenTo(User, 'change:loaded', this.updateSaveStreamButton);
},
updateSaveStreamButton: function () {
var userLoaded = User.get('loaded');
var templateHelpers = this.templateHelpers();
this.ui.saveStreamButton.toggleClass('disabled', userLoaded);
this.ui.saveSelectedButton.attr('title', userLoaded ? templateHelpers.saveStreamMessage : templateHelpers.cantSaveNotSignedInMessage);
}Context
StackExchange Code Review Q#41417, answer score: 3
Revisions (0)
No revisions yet.