1

我正在将 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>");

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

该列表显示得很好,并且该端的所有内容都可以正常工作。然后,我将以下内容附加到每个列表项的单击事件中:

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 显示为未定义。

我无法想象为什么切换这些会产生任何影响,但它似乎确实如此。

只是为了清楚起见,这里是使用 Stackmob.Model 时的模型:

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

有任何想法吗?如果它根本不起作用,我会把它归结为一些非常愚蠢的事情,但由于它可以很好地扩展 Backbone,但不能很好地扩展 StackMob,我真的很困惑。

谢谢!

4

2 回答 2

1

好的,我想出了一个解决这个问题的方法。

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

使用 Backbone,该 ID 显示为对象的根属性,位于 place.id。对于 StackMob,无论出于何种原因,它都不是。它存储在 Attributes 对象里面Place(就像你调用了 一样place.set("id"))。

因此,当我通过 ID 获取它时,StackMob 正在寻找对象上的根属性“id”,没有找到它,并返回“未定义”。

通过放入this.id = this.get("id")模型的初始化,我能够将它放到根目录并成功检索模型。

我仍然不确定为什么使用 Backbone 将 ID 设置在根目录,而不是 StackMob,但无论如何,至少有一个解决方案。

于 2012-11-30T01:41:23.680 回答
1

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

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

希望有帮助!

埃里克

于 2012-11-30T00:52:54.020 回答