使用列名称获取商店值 - EXTJS 4

时间:2013-02-22 23:56:32

标签: javascript json extjs extjs4 store

Ext.define('GoogleMarkerModel', {
        extend: 'Ext.data.Model',
        fields: ['Locating','MainPower','Acc','PowerOff','Alarm','Speed','Direction','Latitude','Longitude','DateTime','MainID', 'DeviceID','IOState','OilState']
    });

    var MarkerStore = Ext.create('Ext.data.JsonStore', {
        model: 'GoogleMarkerModel',
        autoLoad: true,
        proxy: {
            type: 'ajax',
            url: 'get-googlemarker.php',
            baseParams: {  //here you can define params you want to be sent on each request from this store
                        mainid: 'value1'
                        },
            reader: {
                type: 'json',
                root: 'images'
            }
        }
    });

tree.on('checkchange', function(node){
        var data = node.data;
        Ext.MessageBox.show({
        title: 'Changed checkbox status',
        msg: 'MainID: ' + data.MainID + ' <br /> Checkbox status: ' + data.checked,
        icon: Ext.MessageBox.INFO
        });

        if (data.checked == true){
        MarkerStore.load({
                        params: {  //here you can define params on 'per request' basis
                                mainid: data.MainID,
                                }
                        })

        var options = {
        lat:MarkerStore[0].Latitude,
        lng:MarkerStore[0].Longitude,
        marker: {title:"Hello World!"},
        listeners: {
                     click: function(e){

                                         }
                    }     
        }     
        addDoctorLocation(options);           
        }       
    })

这是获取返回值的示例

http://localhost/GPS/examples/tabs/get-googlemarker.php?mainid=1  

返回

[{"ID":"1808","Locating":"1","MainPower":"0","Acc":"1","PowerOff":"1","Alarm":"128","Speed":"0","Direction":"293","Latitude":"5.391788482666016","Longitude":"100.29693603515625","DateTime":"2013-02-19 15:44:36","MainID":"1","IOState":"0","OilState":"0"}]

这是get-googlemarker.php的返回值, 我想在lat变量中保存Latitude值,在longt变量中保存Longitude。像这样:

找到MainID为1的行,并获取列名称纬度值。

更新2

var lati,longi;
        var record = MarkerStore.findRecord('MainID',data.MainID);
        if(record) {
            lati = record.get('Latitude'); 
        longi = record.get('Longitude'); 
        }

记录返回为空,找不到MainID = 1?为什么? data.MainID值为1。

更新3

Ext.define('GoogleMarkerModel', {
    extend: 'Ext.data.Model',
    idProperty:'MainID',
    fields: ['ID','Locating','MainPower','Acc','PowerOff','Alarm','Speed','Direction','Latitude','Longitude','DateTime','MainID','IOState','OilState']
});

var MarkerStore = Ext.create('Ext.data.JsonStore', {
    model: 'GoogleMarkerModel',
    autoLoad: true,
    proxy: {
        type: 'ajax',
        url: 'get-googlemarker.php',
        baseParams: {  //here you can define params you want to be sent on each request from this store
                    mainid: 'value1'
                    },
        reader: {
            type: 'json',
            idProperty : 'MainID',
        }

    }
});

我添加了idProperty,但仍然无法正常工作。

ERROR
enter image description here

最新代码

tree.on('checkchange', function(node){
        var data = node.data;

        if (data.checked == true){
        MarkerStore.load({
                        params: {  //here you can define params on 'per request' basis
                                mainid: data.MainID,
                                }
                        })


        var lati,longi;
        var recordPos = MarkerStore.findBy(function(rec,id){
             return rec.data.MainID == data.MainID;
        }, this);
        if(recordPos > -1) {
           var record = MarkerStore.getAt(recordPos);
           lati = record.get('Latitude'); 
           longi = record.get('Longitude'); 
        }


        Ext.MessageBox.show({
        title: 'Changed checkbox status',
        msg: 'MainID: ' + data.MainID + ' <br /> Checkbox status: ' + data.checked + ' <br /> lati: ' + lati + ' <br />',
        icon: Ext.MessageBox.INFO
        });

        var options = {
        lat:lati,
        lng:longi,
        marker: {title:"Hello World!"},
        listeners: {
                     click: function(e){

                                         }
                    }     
        }     
        addDoctorLocation(options);           
        }       
    })

仍然无法获得lati值。有什么想法?
如何确定MarkerStore里面有数据?我认为MarkerStore是空的。怎么检查这个?

更新4

var lati,longi;
        var recordPos = MarkerStore.findRecord('MainID', '1');
           lati = recordPos.get('Latitude'); 
           longi = recordPos.get('Longitude'); 

仍然无法正常工作,recordPos为null。在FIREBUG上发现错误

TypeError: recordPos is null
[Break On This Error]   
lati = recordPos.get('Latitude');

我认为是JSON商店保存PHP数据的问题

更新5

我可以肯定JSON商店有数据,因为我尝试使用此代码打印所有JSON商店数据

MarkerStore.on('load', function(store, records) {
    for (var i = 0; i < records.length; i++) {
    console.log(records[i].get('Latitude'));
    };
});

它正在控制台上打印数据

2 个答案:

答案 0 :(得分:5)

一些提示:JSON支持对象,数组,字符串,布尔值,浮点数,但你只使用字符串?另外还有一个自动字段配置,所以所有都会保留字符串接下来是您没有为您的模型和读者定义idProperty。根据你的JSON字符串,我猜这是ID。你应该添加一行

idProperty:'ID'

到模型和阅读器,并将字段ID添加到模型中。如果你不想使用ID我想它会是MainID所以插入它。现在,如果您有一个idProperty,您可以通过调用store.getById(1234)来获取该ID的记录。

您也可以进行此类自定义搜索

var lati,longi;
var recordPos = MarkerStore.findBy(function(rec,id){
     return rec.data.MainID == data.MainID;
}, this);
if(recordPos > -1) {
   var record = MarkerStore.getAt(recordPos);
   lati = record.get('Latitude'); 
   longi = record.get('Longitude'); 
}

如果没有返回任何内容,请检查商店中是否有数据,如果有,请提供有关商店如何设置该记录的更多信息。

答案 1 :(得分:1)

正如sra所说,您可以设置idProperty

var MarkerStore = Ext.create('Ext.data.JsonStore', {
    model: 'GoogleMarkerModel',
    autoLoad: true,
    proxy: {
        type: 'ajax',
        url: 'get-googlemarker.php',
        baseParams: {
            mainid: 'value1'
        },
        reader: {
            type: 'json',
            root: 'images',
            idProperty: 'MainId'
        }
    }
});

然后按MarkerStore.getById(123)或'MarkerStore.findRecord('MainId',123)'找到记录

重要:似乎extjs使用===运算符而不是==来比较两个变量。然后,如果变量具有int类型而另一个具有字符串类型,则比较可能为假(例如,对于“1”=== 1)。 那么你应该使用'MarkerStore.findRecord('MainId','123')'。