2012-06-27 4 views
0

У меня есть вид Parent и Child. Child вид расширяет Parent события с:Магистраль: установите модель родительского вида (отличная от дочерней модели)

initialize : function() { 
     // don't overwrite parent's events 
     this.events = _.extend({}, ExerciseRowView.prototype.events, this.events); 
    }, 

Однако Parent ожидает ParentModel и Child ожидает ChildModel, поэтому, когда событие передается Parent, модель является ChildModel. Как установить модель Parent в отличие от модели Child?

Спасибо!

Вот источник, по запросу.

ParentView ака ExerciseRowView:

var ExerciseRowView = Parse.View.extend({ 
     tagName : 'div', 
     className : 'exerciseWrapper', 

     template : _.template(exerciseElement), 

     events : { 
      'click .icon_delete' : 'confirmDelete', 
      'click .name' : 'showDetailsPopup' 
     }, 

     confirmDelete : function() { 
      var that = this; 

      if(confirm("Are you sure you want to delete this exercise?")) { 
       this.destroy({ 
        success: function(exercise) { 
         // log the action 
         Log.add(Log.ACTION_EXERCISE_DELETED, exercise.get("name")); 

         that.$el.fadeOut(); 
        } 
       }); 
      } 
     }, 

     showDetailsPopup : function() { 
      (new ExerciseDetailsView({model: (this.model.constructor == Exercise ? this.model : this.model.get("exercise"))})).render(); 
     }, 

     // accept data as a parameter for workoutexercises 
     render : function(data) { 
      _.defaults(data, { 
       exercise: this.model, 
       Muscle : Muscle, 
       Equipment : Equipment, 
       Exercise : Exercise, 
       Break : Break, 
       HTMLHelper : HTMLHelper, 
       User : User 
      }); 
      $(this.el).html(this.template(data)); 
      return this; 
     } 
    }); 

ChildView ака WorkoutExerciseRowView:

var WorkoutExerciseRowView = ExerciseRowView.extend({  

     events : { 
      "click .icon_randomize" : "changeToRandomExercise" 
     }, 

     initialize : function() { 
      // don't overwrite parent's events 
      this.events = _.extend({}, ExerciseRowView.prototype.events, this.events); 
     }, 

     render: function() { 
      // override the template data with workout exercise template data 
      return ExerciseRowView.prototype.render.call(this, { 
       workoutExercise : this.model, 
       exercise : this.model.get("exercise"), 
       workoutSection : this.model.get("section"), 
       isEditable : true, 
       number : this.options.number, 
       WorkoutExercise : WorkoutExercise, 
       WorkoutSection : WorkoutSection 
      }); 
     }, 

     changeToRandomExercise : function(e) { 
      // pick a random alternative exercise 
      var newExerciseId; 
      do { 
       newExerciseId = _.keys(this.model.get("alternativeExercises"))[ Math.floor(Math.random() * _.keys(this.model.get("alternativeExercises")).length) ]; 
      } while(newExerciseId == this.model.get("exercise").id); 

      // grab it 
      var that = this; 
      (new Parse.Query(Exercise)).get(newExerciseId, { 
       success: function(exercise) { 
        // update the workout exercise 
        that.model.set("exercise", exercise); 

        // render it 
        that.render(); 
       } 
      }); 
     } 
    }); 

В настоящее время (как вы можете видеть), я тест, чтобы увидеть, если this.model.constructor == Exercise внутри ExerciseRowView. Если это не так, я знаю, что у меня есть WorkoutExercise, внутри которого является Exercise, поэтому я использую this.model.get("exercise"):

showDetailsPopup : function() { 
      (new ExerciseDetailsView({model: (this.model.constructor == Exercise ? this.model : this.model.get("exercise"))})).render(); 
     }, 

Это не похоже на чистейшем возможное решение, хотя.

+1

Можете ли вы опубликовать полный источник, по сути или что-то еще? – skyw00lker

+0

@ skyw00lker сделано по вашему запросу :) – Garrett

ответ

1

, что я мог думать о том, что вы определяете функцию для каждого вида

ParentView

getExercise: function() { 
    return this.model; 
} 

ChildView

getExercise: function() { 
    return this.model.get('exercise'); 
} 

А затем изменить функцию

showDetailsPopup: function() { 
    (new ExerciseDetailsView({model: this.getExercise()})).render(); 
} 

Как насчет этого?

+0

Это чище, я дам вам это. Не волшебное решение, которое я искал, но мне кажется лучшим для меня. – Garrett

+0

Я думаю, что мой ответ волшебный в том, что «назад к основополагающим» способом;) – jakee

Смежные вопросы