2013-05-27 2 views
0

Предисловие: Я - опорная точка noob. Большая часть того, что вы видите ниже, может быть ужасным кодом.Информация о прохождении переговоров между Backbone.Views

Итак, вот что у меня есть: Я создаю мобильный трекер для отслеживания тренировок. Я использую фреймворк Junior для обработки некоторых видов переключения - это может быть моей проблемой, но сомнительно.

Это приложение имеет 2 модели: app.Workout и app.Exercise. Оба они не привязаны ни к одной базе данных, я просто использую localStorage на этом этапе. Эти модели также имеют 2 коллекции, ала:

var app = app || {}; 

(function() { 
    'use strict'; 

    /* collection */ 
    app.ExercisesCollection = Backbone.Collection.extend({ 
    model: app.Exercise, 
    localStorage: new Backbone.LocalStorage("Exercises") 
    }); 

    /* create the collection */ 
    app.Exercises = new app.ExercisesCollection(); 

})(); 

Отлично, теперь у нас есть коллекция.

Как вы знаете, есть тренировки. Эти тренировки связаны с ними Упражнения. Я решил выделить две модели и коллекции, потому что, полагаю, это может стать слишком сложным. Может, я ошибаюсь?

Структура My View также довольно простая. Поток будет идти-то вроде:

Home -> 
    Workouts -> 
    (you can add workouts here, or delete) 
    Exercises -> 
    (you can add exercises here, or delete) 
    Add Exercise 

, что я борюсь с как передавать данные между этими видами. Например, я добавил тренировку (которая отлично работает, я просто добавляю в коллекцию). Теперь я выбрал эту тренировку и хочу добавить к ней упражнения. Отлично, я загружаю AddExerciseView, но как этот вид знает, в какую тренировку я хочу добавить упражнение?

Я пробовал «передавать» некоторые вещи в вариантах, но это, похоже, не работает.

onClickButtonAdd: function() { 
    Jr.Navigator.navigate('add-exercise', { 
    workoutName: this.workoutName, 
    trigger: true, 
    animation: { 
     type: Jr.Navigator.animations.SLIDE_STACK, 
     direction: Jr.Navigator.directions.UP 
    } 
    }); 
} 

Я пытаюсь передать workoutName, но это не работает.

Я думаю об этом праве, или есть лучший способ управлять видами/моделями (я слышал о Маррионте).

Спасибо!

ответ

2

Существует два подхода к чистому соединению видов.

Pass модель к мнениям как опции

В этом случае вы могли бы сделать что-то вроде new AddExerciseView({workout: selectedWorkoutModel}) и эта точка зрения будет собирать данные от пользователя, создать новый экземпляр Exercise модели, и добавить его к модели тренировки он получил в его вариантах инициализации.

Просмотров испускают события и маршрутизатор/контроллер принимает его оттуда

В этой версии вашей AddExerciseView бы просто собрать данные, создать новый экземпляр exercise модели, а затем испускают событие как create-exercise. Затем выполняется работа вида, и она не знает и не заботится о том, что происходит с экземпляром модели упражнений с этого момента. В вашем коде «клей», который может жить в вашем маршрутизаторе или выделенном объекте контроллера, вы связываете прослушиватель событий с экземпляром AddExerciseView, а при возникновении события create-exercise вы добавляете новый экземпляр модели упражнений в соответствующий экземпляр тренировки.

Как правило, первый вариант в порядке, особенно для небольших приложений, а вторая версия становится предпочтительнее, так как ваше приложение становится немного больше, а представления начинают использоваться повторно в нескольких разных контекстах.

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