diff --git a/app/assets/javascripts/discourse/components/computed.js b/app/assets/javascripts/discourse/components/computed.js new file mode 100644 index 000000000..c97ead1ee --- /dev/null +++ b/app/assets/javascripts/discourse/components/computed.js @@ -0,0 +1,17 @@ +Discourse.computed = { + + /** + Returns whether two properties are equal to each other. + + @method propertyEqual + @params {String} p1 the first property + @params {String} p2 the second property + @return {Function} computedProperty function + **/ + propertyEqual: function(p1, p2) { + return Ember.computed(function() { + return this.get(p1) === this.get(p2); + }).property(p1, p2); + } + +} diff --git a/app/assets/javascripts/discourse/helpers/i18n_helpers.js b/app/assets/javascripts/discourse/helpers/i18n_helpers.js index 2027296e5..b6b7af10f 100644 --- a/app/assets/javascripts/discourse/helpers/i18n_helpers.js +++ b/app/assets/javascripts/discourse/helpers/i18n_helpers.js @@ -37,14 +37,11 @@ Ember.Handlebars.registerHelper('i18n', function(property, options) { Ember.Handlebars.registerHelper('countI18n', function(key, options) { var view = Discourse.View.extend({ tagName: 'span', + shouldRerender: Discourse.View.renderIfChanged('countChanged'), render: function(buffer) { buffer.push(I18n.t(key, { count: this.get('count') })); - }, - - countChanged: function() { - this.rerender(); - }.observes('count') + } }); return Ember.Handlebars.helpers.view.call(this, view, options); diff --git a/app/assets/javascripts/discourse/templates/post.js.handlebars b/app/assets/javascripts/discourse/templates/post.js.handlebars index a9f990647..57323e820 100644 --- a/app/assets/javascripts/discourse/templates/post.js.handlebars +++ b/app/assets/javascripts/discourse/templates/post.js.handlebars @@ -60,7 +60,7 @@
{{collection contentBinding="internalLinks" itemViewClass="Discourse.PostLinkView" tagName="ul" classNames="post-links"}} - {{#if controller.details.can_reply_as_new_topic}} + {{#if topic.details.can_reply_as_new_topic}} {{i18n post.reply_as_new_topic}} {{/if}}
diff --git a/app/assets/javascripts/discourse/views/actions_history_view.js b/app/assets/javascripts/discourse/views/actions_history_view.js index c43f6b4b1..8ca6aee17 100644 --- a/app/assets/javascripts/discourse/views/actions_history_view.js +++ b/app/assets/javascripts/discourse/views/actions_history_view.js @@ -11,18 +11,14 @@ Discourse.ActionsHistoryView = Discourse.View.extend({ tagName: 'section', classNameBindings: [':post-actions', 'hidden'], - hidden: (function() { - return this.blank('content'); - }).property('content.@each'), + hidden: Em.computed.empty('content'), - usersChanged: (function() { - return this.rerender(); - }).observes('content.@each', 'content.users.@each'), + shouldRerender: Discourse.View.renderIfChanged('content.@each', 'content.users.@each'), // This was creating way too many bound ifs and subviews in the handlebars version. render: function(buffer) { - if (!this.present('content')) return; + return this.get('content').forEach(function(c) { var actionString, iconsHtml; buffer.push("
"); diff --git a/app/assets/javascripts/discourse/views/buttons/dropdown_button_view.js b/app/assets/javascripts/discourse/views/buttons/dropdown_button_view.js index 9defe80f1..9d9e8bfc6 100644 --- a/app/assets/javascripts/discourse/views/buttons/dropdown_button_view.js +++ b/app/assets/javascripts/discourse/views/buttons/dropdown_button_view.js @@ -10,6 +10,8 @@ Discourse.DropdownButtonView = Discourse.View.extend({ classNames: ['btn-group'], attributeBindings: ['data-not-implemented'], + shouldRerender: Discourse.View.renderIfChanged('text', 'longDescription'), + didInsertElement: function(e) { // If there's a click handler, call it if (this.clicked) { @@ -26,10 +28,6 @@ Discourse.DropdownButtonView = Discourse.View.extend({ this.$('ul li').off('click.dropdown-button'); }, - textChanged: function() { - this.rerender(); - }.observes('text', 'longDescription'), - render: function(buffer) { buffer.push("

" + this.get('title') + "

"); buffer.push("