backbone.js, представления и маршрутизация

Я разрабатываю приложение, используя slim, backbone.js и jquery mobile с серверной частью MySQL.

Рабочий процесс идет по схеме:

1) Найдите модуль uni. 2) Перечислите соответствующие модули. 3) Выберите и просмотрите страницу сведений о модуле. 4) Список лекторов, связанных с модулем. 5) Выберите и просмотрите лектора.

Я выполнил шаги с 1 по 4, но не могу отобразить страницу сведений о лекторе. Я думаю, что, возможно, я неправильно передаю идентификатор в вызов API, или моя маршрутизация испорчена.

В моем index.php у меня есть список вызовов API:

$app = новый Slim();

$app->get('/modules', 'getModules'); $app->get('/modules/:id', 'getModule'); $app->get('/modules/search/:query', 'getModulesByName'); $app->get('/modules/:id/students', 'getStudents'); $app->get('/modules/:id/lecturers', 'getLecturers'); $app->get('/modules/lecturers/:id/lecturer', 'getLecturer');

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

getLecturers работает и находится здесь для справки:

function getLecturers($id) { $sql = "выберите l.staffNumber, l.firstName, l.lastName, l.moduleNo1, l.moduleNo2, l.email, m.moduleNo из таблицы лекторов l, таблицы модулей m, где m.moduleNo= :id И (l.moduleNo1=:id ИЛИ l.moduleNo2=:id)";

try {
    $db = getConnection();
    $stmt = $db->prepare($sql);
    $stmt->bindParam("id", $id);
    $stmt->execute();
    $lecturer = $stmt->fetchAll(PDO::FETCH_OBJ);
    $db = null;

    if (!isset($_GET['callback'])) {
        echo json_encode($lecturer);
    } else {
        echo $_GET['callback'] . '(' . json_encode($lecturer) . ');';
    }

} catch(PDOException $e) {
    echo '{"error":{"text":'. $e->getMessage() .'}}';
} }

getLecturer (сингл) находится здесь:

function getLecturer($id) { $sql = "выберите l.staffNumber, l.firstName, l.lastName, l.moduleNo1, l.moduleNo2, l.email из лекторской таблицы l, где l.staffNumber=:id";

try {
    $db = getConnection();
    $stmt = $db->prepare($sql);
    $stmt->bindParam("id", $id);
    $stmt->execute();
    $lecturer = $stmt->fetchObject();
    $db = null;

    if (!isset($_GET['callback'])) {
        echo json_encode($lecturer);
    } else {
        echo $_GET['callback'] . '(' . json_encode($lecturer) . ');';
    }

} catch(PDOException $e) {
    echo '{"error":{"text":'. $e->getMessage() .'}}';
} }

Вот мои маршруты в main.js:

var AppRouter = Backbone.Router.extend({

routes:{
    "":"list",
    "list":"list",
    "modules/:id":"moduleDetails",
    "modules/:id/students":"moduleStudents",
    "modules/:id/lecturers":"moduleLecturers",
    "modules/:id/lecturers/:id/lecturer":"lecturerDetails"
},

и соответствующие функции moduleLecturers и LectorDetails:

moduleLecturers: function (id) { var module = new Module({id:id}); модуль.лекторы.fetch(); this.changePage(новый ModuleLecturersPage({model:module.lecturers})); },

lecturerDetails:function (id) {
    var lecturer = new Lecturer({id:id});
    var self = this;
    module.lecturers.lecturer.fetch({
        success:function (data) {
            self.changePage(new LecturerView({model:data}));
        }
    });
},

Затем у меня есть модели лекторов и лекторов, а также коллекция лекторов:

window.Lecturers = Backbone.Model.extend({

urlRoot:"../api/lecturers",

initialize:function () {
    this.lecturers = new lecturersCollection();
    this.lecturers.url = '../api/modules/' + this.id + '/lecturers';
}

});

window.lecturersCollection = Backbone.Collection.extend({

model:Lecturers,

url:"../api/lecturers",

});

//новый

window.Lecturer = Backbone.Model.extend({

urlRoot:"../api/lecturer",

});

и представление лектора, указывающее на html-шаблон «детали лектора», который не отображается:

window.LecturerView = Backbone.View.extend({

initialize:function () {
    this.template = _.template(tpl.get('lecturer-details'));
},

render:function (eventName) {
    $(this.el).html(this.template(this.model.toJSON()));
    return this;
}

});

Элемент списка лекторов, при нажатии на который должен отображаться подробный вид, содержит ссылку: href='#modules/‹%= moduleNo %>/#lecturers/‹%= staffNumber %>'

Хотя URL-адрес кажется правильным в браузере (... jquerymobile/#modules/999003/#lecturers/123001), страница сведений о лекторе просто не отображается.

Я уже пару дней ломаю голову над этим - если кто-нибудь заметит что-то не на месте, буду очень признателен!


person user2204544    schedule 05.04.2013    source источник


Ответы (1)


Вы не можете использовать двойной хэштег, просто исправьте ссылку:

У тебя есть:

href='#modules/<%= moduleNo %>/#lecturers/<%= staffNumber %>'

Право должно быть:

href='#modules/<%= moduleNo %>/lecturers/<%= staffNumber %>'
person Daniel Aranda    schedule 06.04.2013