我在设置相关的商店/模型概念时遇到了很大的问题。
我有模特/商店
app.models.User = Ext.regModel('app.models.User', {
fields: [
{name: 'id', type: 'int'},
{name: 'userID', type: 'string'},
{name: 'userName', type: 'string'}
],
associations: [
{type: 'hasMany', model: 'app.models.Friend', name:'friends', associationKey:'friends'},
]
});
app.models.UserFriendsList = Ext.regModel('app.models.UserFriendsList', {
fields: [
{name: 'id', type: 'int'},
{name: 'userID', type: 'string'},
{name: 'userName', type: 'string'}
],
belongsTo: 'app.models.User',
associations: [
{type: 'hasMany', model: 'app.models.Friend', name: 'friend'}
]
});
app.models.Friend = Ext.regModel('app.models.Friend', {
fields: [
{name: 'id', type: 'int'},
{name: 'userID', type: 'string'},
{name: 'userName', type: 'string'}
],
belongsTo: 'app.models.UserFriendsList',
});
app.stores.userStore = new Ext.data.Store({
model: 'app.models.User',
data:[
{
"id": "01",
"userName": "Username"
"friends": [
{ "id": "02",
"userName": "Friend 1"
},
{ "id": "03",
"userName": "Friend 2"
},
]
}
]
});
然后我用
var currentUser = app.stores.User.getAt(0);
console.log(currentUser);
var friends = currentUser.friends().getAt(0);
console.log(friends);
跟踪有关当前加载用户的一些调试信息。
当我使用'associationKey'参数而没有'name'参数时,跟踪显示数据被正确地提取到被跟踪对象'currentUser'的数据部分。但是没有函数friends()可以使用。我只收到错误
TypeError: Result of expression 'currentUser.friends' [undefined] is not a function.
当我使用没有'associationKey'参数(或两个参数)的'name'参数时,会创建实例函数friends()但是没有数据被提取到对象中,因此我无法使用它。
我的代码出了什么问题?或者我对概念的误解在哪里?
日Thnx !!!
答案 0 :(得分:3)
您的模型声明和has many associations似乎有些问题。
首先,您的模型名称应该只是简单的语句,而不是完全限定的对象。它使声明更容易。
app.models.User = Ext.regModel('app.models.User', {
应该是:
app.models.User = Ext.regModel('User', {
其次,您需要具有将id彼此正确命名的字段。
app.models.Friend = Ext.regModel('Friend', {
fields: [
{name: 'user_id', type: 'int'},
.....
],
现在您的模型名为User
,而您的朋友模型引用user_id
,Sencha Touch会自动正确使用该关联。
第三,您需要修复您的关联声明。您将属性associationKey添加到关联。在我提到的第一点之后,文档和模型中不存在哪个应该只是'朋友'。
associations: [
{type: 'hasMany',
model: 'Friend',
name:'friends',
},
]
第四,要获得你需要在商店上加载的朋友。 currentUser.friends().load().getAt(0);
你可以得到花哨的东西,并将不同的外围密钥声明为不同的名称,但此时我只是得到了基本的例子并且正在工作。
Sencha有一个关于associations and validations入门的好教程。