使用StackMob.Model而不是Backbone.Model时“未定义”

时间:2012-11-29 22:03:28

标签: backbone.js stackmob

我正在将Backbone.js和StackMob用于移动应用程序,并遇到了一个我无法理解的奇怪问题。根据StackMob文档,StackMob.Model扩展了Backbone.Model,因此可以访问相同的方法,并且应该以相同的方式工作。据我了解,这是一个简单的交换。

情况如下:

我有一个正在通过对FourSquare的API调用填充的集合,该集合将作为列表呈现到视图中。列表中的每个模型都使用data-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>");

(上面的代码是循环构建列表的内容)。

列表显示正常,并且该端的所有内容都可以正常工作。然后,我在每个列表项上附加了click事件:

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,然后根据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,我真的很困惑。

谢谢!

2 个答案:

答案 0 :(得分:1)

在使用StackMob.Model,StackMob.Collection和其他StackMob项目之前,您需要首先调用StackMob.init(..)。

在调用StackMob.init(..)之前,您的外部脚本可能正在执行。

希望有所帮助!

埃里克

答案 1 :(得分:1)

好的,我找到了解决这个问题的方法。

这是交易。当我调用this.collection.get(window.item)时,我正在查找被点击的Place对象上的ID属性(因为我将该ID传递到URL中,点击后很容易检索)。

使用Backbone,该ID在place.id显示为对象的root属性。有了StackMob,无论出于何种原因,它都没有。它存储在Place内的Attributes对象中(就好像你调用了place.set("id"))。

所以,当我想通过ID获取它时,StackMob正在寻找对象的根属性“id”,而不是找到它,并返回“undefined”。

通过将this.id = this.get("id")置于模型的初始化中,我能够将其连接到根并成功检索模型。

我仍然不确定为什么ID被设置在Backbone的根目录,但不是StackMob,但不管怎样,至少有一个解决方案。