diff --git a/reviewboard/static/rb/js/models/baseResourceModel.js b/reviewboard/static/rb/js/models/baseResourceModel.js
index cc453ae26e3e0716c693cc86e4022353228630ab..5c5270a750c46b0f50a6aba7238a27cc5dd16382 100644
--- a/reviewboard/static/rb/js/models/baseResourceModel.js
+++ b/reviewboard/static/rb/js/models/baseResourceModel.js
@@ -182,10 +182,7 @@ RB.BaseResource = Backbone.Model.extend({
      */
     fetch: function(options, context) {
         var parentObject,
-            fetchObject = _.bind(function() {
-                Backbone.Model.prototype.fetch.call(
-                    this, _.bindCallbacks(options, context));
-            }, this);
+            fetchObject;
 
         options = options || {};
 
@@ -199,6 +196,8 @@ RB.BaseResource = Backbone.Model.extend({
         }
 
         parentObject = this.get('parentObject');
+        fetchObject = _.bind(Backbone.Model.prototype.fetch, this,
+                             _.bindCallbacks(options, context));
 
         if (parentObject) {
             if (parentObject.cid) {
diff --git a/reviewboard/static/rb/js/models/commentEditorModel.js b/reviewboard/static/rb/js/models/commentEditorModel.js
index c0496c695becc11b121f1e4460f7afd40de7021b..8ccfa5b3453b14f43c960a20ef083cb8ee8003fa 100644
--- a/reviewboard/static/rb/js/models/commentEditorModel.js
+++ b/reviewboard/static/rb/js/models/commentEditorModel.js
@@ -98,6 +98,7 @@ RB.CommentEditor = Backbone.Model.extend({
      */
     cancel: function() {
         var comment = this.get('comment');
+
         this.off('change:comment', this._updateFromComment, this);
 
         if (comment) {
@@ -182,16 +183,27 @@ RB.CommentEditor = Backbone.Model.extend({
         this.set('statusText', '');
 
         if (comment) {
+            /*
+             * Set the attributes based on what we know at page load time.
+             *
+             * Note that it is *possible* that the comments will have changed
+             * server-side since loading the page (if the user is reviewing
+             * the same diff in two tabs). However, it's unlikely.
+             *
+             * Doing this before the ready() call ensures that we'll have the
+             * text and state up-front and that it won't overwrite what the
+             * user has typed after load.
+             */
+            this.set({
+                dirty: false,
+                openIssue: comment.get('loaded')
+                           ? comment.get('issueOpened')
+                           : this.defaults.openIssue,
+                text: comment.get('text')
+            });
+
             comment.ready({
-                ready: function() {
-                    this.set({
-                        dirty: false,
-                        openIssue: comment.get('loaded')
-                                   ? comment.get('issueOpened')
-                                   : this.defaults.openIssue,
-                        text: comment.get('text')
-                    });
-                }
+                ready: this._updateState
             }, this);
         }
     },
@@ -208,7 +220,7 @@ RB.CommentEditor = Backbone.Model.extend({
             comment = this.get('comment');
 
         this.set({
-            canDelete: canEdit && editing && comment && comment.get('loaded'),
+            canDelete: canEdit && editing && comment && !comment.isNew(),
             canSave: canEdit && editing && this.get('text') !== ''
         });
     }
diff --git a/reviewboard/static/rb/js/models/tests/commentEditorModelTests.js b/reviewboard/static/rb/js/models/tests/commentEditorModelTests.js
index d126b2b1524630dd2dd551fb4dbdc87015f7633c..d689e3943675d7de3178b76c58ce11a1dc03ebaf 100644
--- a/reviewboard/static/rb/js/models/tests/commentEditorModelTests.js
+++ b/reviewboard/static/rb/js/models/tests/commentEditorModelTests.js
@@ -83,7 +83,10 @@ describe('models/CommentEditor', function() {
 
             it('When editing existing comment', function() {
                 var comment = createComment();
-                comment.set('loaded', true);
+                comment.set({
+                    id: 123,
+                    loaded: true
+                });
                 editor.set('comment', comment);
 
                 editor.beginEdit();
@@ -92,7 +95,10 @@ describe('models/CommentEditor', function() {
 
             it('When editing existing comment with canEdit=false', function() {
                 var comment = createComment();
-                comment.set('loaded', true);
+                comment.set({
+                    id: 123,
+                    loaded: true
+                });
 
                 editor.set({
                     canEdit: false,
@@ -184,7 +190,10 @@ describe('models/CommentEditor', function() {
 
             it('After deleting', function() {
                 var comment = createComment();
-                comment.set('loaded', true);
+                comment.set({
+                    id: 123,
+                    loaded: true
+                });
                 editor.set('comment', comment);
 
                 editor.beginEdit();
