我正在尝试制作一个简单的文件浏览器应用程序,但这让我很头疼。我试图将它移植到带有 FixtureAdapter 的 jsfiddle 中:http: //jsfiddle.net/Rolus/bB2mr/23/
(我不确定我是否在小提琴中正确定义了固定装置,这是我第一次使用这个适配器。)
我试图让应用程序(在路由器中)做的是向服务器请求一个包含 3 个“子”文件的“根”文件(目录)。然后服务器返回包含这 3 个“子”文件的响应:
{
"file":{
"uri":"L3Rlc3QvdGVzdDA=",
"size":1000,
"children":["dGVzdC90ZXN0MC90ZXN0MS5ibGE=",
"dGVzdC90ZXN0MC90ZXN0Mi5ibGE=",
"dGVzdC90ZXN0MC90ZXN0My5ibGE="]
}
}
(URI 是 base64 编码的。)然后我要求它获取孩子,并且应用程序发出第二个请求(如预期的那样),该请求返回以下响应:
{
"files" : [
{
"uri":"dGVzdC90ZXN0MC90ZXN0MS5ibGE=",
"size":1,
"children":[]
},
{
"uri":"dGVzdC90ZXN0MC90ZXN0Mi5ibGE=",
"size":2,
"children":[]
},
{
"uri":"dGVzdC90ZXN0MC90ZXN0My5ibGE=",
"size":3,
"children":[]
}]
}
然而,在这个过程中,我注意到了两件事:
第一:即使'root'模型似乎知道它的'children'(它提出了我期望它提出的请求)它似乎不知道它自己的'uri'或'size',因为添加了这个didLoad方法到模型:
didLoad: function () {
console.log("id: "+ this.id + " " + this.get("uri") + this.get("size"));
}
结果将以下内容打印到控制台:
id: L3Rlc3QvdGVzdDA= nullnull
其次,它似乎忽略了我将主键更改为“uri”DS.JSONSerializer._primaryKey(App.File)
返回“id”的努力。我正在尝试几种不同的方法来更改模型中的 primaryKey。
在发出第二个请求后,又有 3 个 didLoad 行输出到控制台:
id: dGVzdC90ZXN0MC90ZXN0MS5ibGE= nullnull
id: dGVzdC90ZXN0MC90ZXN0Mi5ibGE= nullnull
id: dGVzdC90ZXN0MC90ZXN0My5ibGE= nullnull
我的视图更新为 3 个空行(“文件名:”,请参阅小提琴中的模板),但它永远不会填充响应数据。
此时脚本终于遇到了错误:
Uncaught TypeError ('hash' undefined): Cannot call method 'hasOwnProperty' of null ember-data.js:6246
DS.JSONSerializer.DS.Serializer.extend.extractId
这似乎是由第二次响应后 JSONSerializer 的第 4 次迭代引起的,而响应数组中只有 3 个项目,所以第 4 次迭代“哈希”显然为空,问题是它为什么要进行第 4 次迭代。
我希望我在这里的胡言乱语是有道理的。只看小提琴可能是最简单的。我真的希望有人能发现其中的一些错误,因为我真的没有想法了。
我正在使用 emberjs v1.0.0-pre.2-123-ga352c48 和 ember-data 修订版 11。
提前致谢。