0

我的 ExtJS (4.2.1) 应用程序中有两个模型,并且想在两个模型之间定义一个“hasOne”关联。但是,我无法让它工作。

我试图遵守http://extjs-tutorials.blogspot.ch/2012/05/extjs-belongsto-association-rules.html中所示的“hasOne”关联规则。

主要型号

Ext.define('Aap.model.TreeNode', {
extend: 'Ext.data.Model',
fields: [
    { name: 'name', type: "string"},
    { name: 'id'},
    { name: 'allgemein_id'}
],
proxy: {
    type: 'ajax',
    url: 'data/treedata.json',
    reader: {
        type: 'json',
        root: 'nodes',
        successProperty: 'success'
    }
},
associations: [
    {
        type: 'hasOne',
        model: 'Aap.model.Allgemein',
        associationKey: 'metaallgemein',
        primaryKey: 'id',
        foreignKey: 'allgemein_id',
        getterName: 'getAllgemein',
        setterName: 'setAllgemein',
        autoLoad: true
    }
]

});

相关型号

Ext.define('Aap.model.Allgemein', {
extend: 'Ext.data.Model',
requires: 'Aap.model.TreeNode',
fields: [
    {name: "name", type: 'string'}, 
    {name: "allgemein_name", type: 'string'}, 
    {name: "ident", type: 'string'}, 
    {name: "georefdat", type: 'string'},
    {name: "fachst", type: 'string'}, 
    {name: "zugberech", type: 'string'}, 
    {name: "echkateg", type: 'string'}, 
    {name: "nachfzeitr", type: 'string'}, 
    {name: "datenmenge"}, 
    {name: "imjr"}, 
    {name: "datenzuw"}, 
    {name: "bemerk", type: 'string'},
    {name: "treenode_id", type: 'int'},
    {name: "id", type: "int"}
],
associations: [
    {
        type: 'belongsTo',
        model: 'Aap.model.TreeNode'
    }
],
proxy: {
    type: 'ajax',
    api: {
        read: 'data/allgemeindata.json'
    },  
    reader: {
        type: 'json',
        root: 'metaallgemein',
        successProperty: 'success'
    }
}

});

主要型号数据

{
"success": true,
"nodes": [
    { "name": "st", "id":"1", "allgemein_id": "1", "expanded": false, "children": [
        { "name": "Geodätische Grundlagen", "id":"4", "allgemein_id": "4", "children": [
            { "name": "Beispiel Datensatz", "id":"6", "allgemein_id": "6", "leaf": true }
        ]},
        { "name": "Bilddaten", "id":"5", "allgemein_id": "5", "loaded": true}
    ]},
    { "name": "BU", "id":"2", "allgemein_id": "2", "loaded": true },
    { "name": "BE", "id":"3", "allgemein_id": "3", "loaded": true }
]

}

关联模型数据

{
"success": true,
"metaallgemein": [
    { 
        "name":"st", 
        "ident": "stident", 
        "georefdat":"stgeorefdat",
        "fachst":"stfach", 
        "zugberech":"stzugangsbe", 
        "echkateg":"stechkateg", 
        "nachfzeitr":"stzeitrnachf", 
        "datenmenge":"stdatenmende", 
        "imjr":"stimjr", 
        "datenzuw":"stdatenzuw", 
        "bemerk":"stbemerk",
        "id": "1",
        "treenode_id": "ext-record-1"
    },
    { 
        "name":"BU", 
        "ident": "buident", 
        "georefdat":"bugeorefdat",
        "fachst":"bufach", 
        "zugberech":"buzugangsbe", 
        "echkateg":"buechkateg", 
        "nachfzeitr":"buzeitrnachf", 
        "datenmenge":"budatenmende", 
        "imjr":"buimjr", 
        "datenzuw":"budatenzuw", 
        "bemerk":"bubemerk",
        "id": "2",
        "treenode_id": "ext-record-2"
    }, ...
            ...
            ...

当我加载我的页面并尝试使用我的 getter 获取相关数据时,会发生以下情况(见图)。

  • 第一次尝试获取关联数据(rec.getAllgemein())时,我没有得到任何数据。
  • 当我第二次使用 getter (rec.getAllgemein()) 时,我得到了数据,但不是正确的。我添加了一个截图来帮助解释这个问题。这似乎是一个更基本的问题。一些数据是关联的,但不正确。其他记录没有任何关联。

我尝试了一个更简单的示例来跟踪问题。但是我什至没有实现使关联在最基本的示例中起作用。似乎我在某个地方犯了一个根本性的错误:

Ext.define('Aap.model.Person', {
extend: 'Ext.data.Model',
requires: 'Aap.model.Address',
fields: [
    {name: 'id', type: 'int'},
    {name: 'name', type: 'string'}, 
    {name: 'address_id', type: 'int'}
],
proxy: {
    type: 'ajax',
    api: {
      read: 'data/persons.json'
    },
    reader: { 
        type: 'json',
        root: 'children',
        successProperty: 'success'
    }
},  
associations: [
    { 
        type: 'hasOne', 
        model: 'Aap.model.Address'
    }
]

});

Ext.define('Aap.model.Address', {
extend: 'Ext.data.Model',
fields: [
    { name: 'id', type: 'int'},
    { name: 'city', type: 'string'}
],
proxy: {
    type: 'ajax',
    api: {
      read: 'data/addresses.json'
    },
    reader: { 
        type: 'json',
        root: 'children',
        successProperty: 'success'
    }
}   

});

Ext.define('Aap.store.Persons', {
extend: 'Ext.data.Store',
model: 'Aap.model.Person',
autoLoad: 'true',
storeId: 'persons'

});

Ext.define('Aap.store.Addresses', {
extend: 'Ext.data.Store',
model: 'Aap.model.Address',
autoLoad: 'true',
storeId: 'addresses'

});

{
"success": true,
"children": [
    { 
        "id": 1,
        "name": "Bernt",
        "address_id": 1
    },
    { 
        "id": 2,
        "name": "Ludowid",
        "address_id": 2
    }
]

}

{
"success": true,
"children": [
    { 
        "id": 1,
        "city": "Berlin"
    },
    { 
        "id": 2,
        "city": "London"
    }
]

}

我不知道问题出在哪里。

  • 是模型定义不正确吗?
  • 数据有问题吗
  • 是模型定义不正确吗?
  • 还是完全不同的东西?

博客条目,例如: ExtJS 4:具有关联和存储的模型 让我更好地理解了关联是如何工作的。但他们并没有帮助我解决问题。

感谢帮助!

4

1 回答 1

0

生成的getter应该异步使用,不能依赖实际的返回值。

// Don't do that
var unreliableResult = m.getAllgemein();

// Do that instead
m.getAllgemein(function(allgemeinRecord) {
    // continue from here...
});

有关详细信息,请参阅文档中名为“Generated getter and setter”的部分。

但是请注意,回调实现似乎有点错误

现在,关于您问题的“错误”数据方面,您的关联配置对我来说似乎是正确的。我很快测试了您的代码,并触发了正确的请求(即关联记录的正确 id)...所以也许您应该详细说明为什么您认为数据“错误”,然后有人可能会发现错误.

于 2013-08-29T10:36:27.137 回答