我正在将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,我真的很困惑。
谢谢!
答案 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,但不管怎样,至少有一个解决方案。