2012-11-29 2 views
1

Я использую Backbone.js и StackMob для мобильного приложения и столкнулся с какой-то странной проблемой, с которой я не могу опустить голову. Согласно документам StackMob, StackMob.Model расширяет Backbone.Model и, таким образом, имеет доступ к тем же методам и должен работать одинаково. Насколько я понимаю, это простой обмен.«Неопределенный» при использовании StackMob.Model вместо Backbone.Model

Вот ситуация:

У меня есть коллекция, которая заселяется с помощью API вызова Foursquare, который визуализируется вне в представлении в виде списка. Каждая модель в списке отображается с атрибутом данных ID:

$("ul#resultsList").append("<li class='result' data-id='" + place.get('id') + "'><span class='listingName'>" + place.get("name") + "</span><span class='listingDetail'>" + place.get("location")["address"] + "</span><span class='listingDetail'>" + place.category + "</span></li>"); 

(приведенный выше код, что через петлю для создания списка).

Этот список показывает все, что нужно, и все, что с ним связано. Тогда я следующее прикрепленный к событию, щелкните по каждому элементу списка:

saveItem: function(e) { 
    window.item = $(e.currentTarget).data("id"); 
    window.newplace = this.collection.get(window.item); 
    console.log("New place: "+ window.newplace); //shows the model in Backbone, undefined in StackMob 
    App.navigate("#add", { 
     trigger: true 
    }); 
}, 

Этот код в основном смотрит на предмет щелкнул, идет и получает идентификатор, затем смотрит на эту модель в коллекции на основе ID и сохраняет его в window.newplace.

Затем приложение переходит к #add, который конкретизирует вид с window.newplace как модель:

addItem: function() { 
    if (!window.newplace) { 
    window.newplace = new Place({}); 
    } 
    this.changePage(new AddItemView({model:window.newplace}), "slide"); 
}, 

Вот проблема:

Это работает точно так же, как и должно быть, когда модель Place настроена как Backbone.Model. Как только я переключу его на StackMob.Model, он показывает window.newplace как undefined.

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

Просто ради полного осветления, вот модель при использовании Stackmob.Model:

window.Place = StackMob.Model.extend({ 
... 
}); 

Любые идеи? Если бы это не сработало, я бы записал это до какой-то действительно глупой вещи, но так как он отлично работает с Backbone, но не StackMob, я действительно смущен.

Спасибо!

+0

Итак, вы говорите, что 'new Place ({})' уступает 'undefined', когда' Place' расширяет 'StackMob.Model', но полезный объект, когда' Place' расширяет 'Backbone.Model'? –

+0

Не совсем (хотя вроде бы вдоль этих линий). Если я пытаюсь запустить 'new Place ({})', когда Place расширяет 'StackMob.Model', он будет работать. Однако у меня есть коллекция мест ('StackMob.Collection' под названием« Места »), где модель« Place ». Когда я пытаюсь получить одну из моделей из этой коллекции и хранить ее в переменной, она не работает с StackMob, но работает с Backbone. –

+0

Или это 'this.collection.get (window.item)', который должен инициализировать 'window.newplace'? –

ответ

1

Перед использованием StackMob.Model, StackMob.Collection и других элементов StackMob вам нужно сначала вызвать StackMob.init (..).

Ваш внешний скрипт, скорее всего, выполняется до вызова StackMob.init (..).

Надеюсь, что это поможет!

Erick

+0

Эрик, спасибо. Я на самом деле вызываю StackMob.init на самом верху документа (в index.html). Я знаю, что он работает, потому что я могу успешно создать и сохранить «Пользователь», используя StackMob ... –

1

Хорошо, я понял, обходной путь для этой проблемы.

Здесь находится сделка. Когда я звонил this.collection.get(window.item), я искал свойство ID на объекте Place, который был нажат (поскольку я передаю этот идентификатор в URL-адрес, его легко получить при щелчке).

С базой, этот идентификатор отображается как свойство корня объекта, на месте.Я бы. С StackMob, по какой-то причине, это не так. Он был сохранен в объекте Атрибуты внутри Place (как если бы вы позвонили place.set("id")).

Итак, когда я искал, чтобы получить его по ID, StackMob искал свойство «id» root для объекта, не обнаруживая его, и возвращал «undefined».

Поставив в инициализацию модели this.id = this.get("id"), я смог получить ее в корневой каталог и успешно получить модель.

Я до сих пор не знаю, почему этот идентификатор был установлен в корне с помощью базовой линии, но не StackMob, но независимо, по крайней мере, есть решение.

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