2013-08-07 2 views
3

По какой-то причине мой код всегда возвращает ту же модель, хотя я вижу, что правильный идентификатор передается после выбора элемента на странице listView.Backbone fetch() всегда возвращает ту же модель

// main.js (relavent function) 

    venueDetails: function (id) { 
     // here, id is correct 
     var venue = new Venue({_id: id}); 
     venue.fetch({success: function(){ 
      // here, the id of venue is changed for some reason 
      console.log(venue.id); 
      $("#content").html(new VenueView({model: venue}).el); 
     }}); 
     this.headerView.selectMenuItem(); 
    }, 

модель,

// model.js (relavent model) 

    var base = 'http://localhost:3000'; 

    window.Venue = Backbone.Model.extend({ 
     urlRoot: base+"/venues", 
     idAttribute: "_id", 
    }); 

    window.VenueCollection = Backbone.Collection.extend({ 
     model: Venue, 
     url: base+"/venues?populate=true" 
    }); 

На картинке вы можете увидеть, где model.id отличается от Whats в URL enter image description here

EDIT: добавлено отображение маршрутизатор

var AppRouter = Backbone.Router.extend ({

routes: { 
    ""      : "home", 
    <!-- venues --> 
    "venues"    : "venueList", 
    "venues/page/:page" : "venueList", 
    "venues/add"   : "addVenue", 
    "venues/:id"   : "venueDetails", 
+0

Ты видя правильный ответ GET и ответ? Попробуйте с сетевой панелью в firebug. – dierre

+0

Хмм, к тому времени, когда он делает запрос на сервер api, он передает неправильный идентификатор. Есть ли какой-то метод, который я должен переопределить, чтобы увидеть, где он может заменить идентификатор? – remotevision

+1

просто используйте console.log (место.ид) после инициализации модели. Печатает ли неправильный идентификатор? Также вставьте сопоставление маршрутизатора. – dierre

ответ

1

Я не знаю, правильно ли используется атрибут _id в модели, поскольку venue.fetch, похоже, вызывает какой-либо тип по умолчанию.

Может попробовать:

window.Venue = Backbone.Model.extend({ 
     urlRoot: base+"/venues", 
     idAttribute: this.options._id, 
    }); 

(и вытащить идентификатор из хэша опций)

И если это не сработает, попробуйте объявляя idAttribute динамически:

window.Venue = Backbone.Model.extend({ 
     urlRoot: base+"/venues", 
     idAttribute: function() { return this.options._id }, 
    }); 
+0

Я получаю ошибку «options not defined». – remotevision

+0

Извините, я написал этот бит кода довольно поздно ночью, я исправил его, чтобы быть this.options – CamelBlues

1

Этот

var base = 'http://localhost:3000'; 

это плохая идея, и совершенно ненужным. Просто избавься от этого полностью. Просто используйте абсолютные пути (например, «/ места») в качестве URL-адресов, и ваше приложение будет работать правильно независимо от того, где он работает.

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

В противном случае вы проверили свой код на стороне сервера на предмет ошибки? Это может быть что-то простое, так как серверный код использует неправильное значение при запросе базы данных.

+0

прямо сейчас, api размещается отдельно от приложения пользовательского интерфейса. вот почему у меня есть полный URL-адрес, и они находятся на разных портах. Я новичок в позвоночнике, поэтому, если есть лучший способ, я все уши! – remotevision

+0

ОК, я пошел вперед и объединил приложение ui в проект api, чтобы упростить вещи. Я все равно получаю тот же результат, когда появляется неправильная модель. – remotevision

+0

UGH! мой код на стороне сервера DID имеет ошибку. Я использую Mongoose и использовал findOne() вместо findById(). спасибо – remotevision

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