0

我是 CodeIgniter 开发人员,我正在尝试学习 ember.js。

我一直在尝试构建一个模型,该模型将对服务器进行 AJAX 调用,拉入 XML 文件,解析数据并返回。

以下是我的模型代码:

App.Statement = Ember.Object.extend();
App.Statement.reopenClass({
    all: function() {
        var transactions = {};
        // FROM: http://jquerybyexample.blogspot.com/2012/04/read-and-process-xml-using-jquery-ajax.html
        $.ajax({
            type: "GET",
            url: "http://www.example.com/transactions.xml",
            dataType: "xml",
            success: function(xml){
                $(xml).find('transaction').each(function(i,v){
                    transactions[i].id      = $(this).attr('id');
                    transactions[i].vendor  = $(this).find('vendor').text();
                    transactions[i].date    = $(this).find('date').text();
                    transactions[i].spent   = $(this).find('spent').text();
                });
            },
            error: function() {
                console.log("An error occurred while processing XML file.");
            }
        });
        return transactions;
    }
});

以下是我的 XML 文件 (transactions.xml) 的内容:

<?xml version="1.0" encoding="UTF-8" ?>
<statement>
    <transaction id="123456">
        <vendor>WH Smiths</vendor>
        <date>2013-05-01</date>
        <spent>10.00</spent>
    </transaction>
    <transaction id="123457">
        <vendor>Gap</vendor>
        <date>2013-05-02</date>
        <spent>39.99</spent>
    </transaction>
    <transaction id="123458">
        <vendor>DSG PLC</vendor>
        <date>2013-05-03</date>
        <spent>1024.99</spent>
    </transaction>
    <transaction id="123459">
        <vendor>Tesco</vendor>
        <date>2013-05-06</date>
        <spent>23.35</spent>
    </transaction>
</statement>

当我使用控制台尝试访问事务对象时,它仍然未定义,任何人都可以指出我正确的方向吗?


更新:

好的,所以根据到目前为止的回复,我的模型现在看起来像这样:

var transaction = Ember.ArrayProxy.create({content: []});

App.Statement = DS.Model.extend({
    all: function() {
        var transactions = {};
        // FROM: http://jquerybyexample.blogspot.com/2012/04/read-and-process-xml-using-jquery-ajax.html
        $.ajax({
            type: "GET",
            url: "http://www.atwright.co.uk/cof/statement.xml",
            dataType: "xml",
            success: function(xml){
                var obj = Ember.Object.create({id:null, vendor:null, date:null, spent:null});
                obj.setProperties({
                    id: $(this).attr('id'), 
                    vendor: $(this).find('vendor').text(), 
                    date: $(this).find('date').text(), 
                    spent: $(this).find('spent').text()
                });
                transaction.pushObject(obj);
            },
            error: function() {
                console.log("An error occurred while processing XML file.");
            }
        });
        return transactions;
    }
});

我如何访问任何数据?我可以看到该事务具有许多与 Ember 相关的属性,但其中没有数据(尽管我可能做错了)。

4

3 回答 3

2

我想问题(除了异步特性之外)var transactions = {};是你只是在创建一个普通的 javascript 对象,它没有任何 Ember 支持,通过 Ember 支持我的意思是你可以绑定到等。

尝试像这样声明您的事务变量:

var transaction = Ember.ArrayProxy.create({content: []});

然后在您的成功函数中迭代结果(代码不是 testet)

...
var obj = Ember.Object.create({id:null, vendor:null, date:null, spent:null});
obj.setProperties({
  id: $(this).attr('id'), 
  vendor: $(this).find('vendor').text(), 
  date: $(this).find('date').text(), 
  spent: $(this).find('spent').text()
});
transaction.pushObject(obj);
...

希望能帮助到你

于 2013-05-16T22:44:00.817 回答
0

$.ajaxcall 是异步的,因此当方法返回时,它会将事务作为空对象返回。这可能就是您在控制台中看到的内容。

此外,大多数检索记录集合的 Ember 应用程序都将它们作为数组返回。这很有用,因为ArrayController可以很容易地观察数组的内容以进行渲染。

于 2013-05-17T02:02:30.803 回答
-1

您在这里没有模型,因为您正在扩展Ember.Object而不是DS.Model. 相反,您可能想要类似的东西:

App.Statement = DS.Model.extend({
    // Ajax stuff goes here.
});

有关详细信息,请参阅定义模型指南。您可能还想查看创建自定义转换,而不是直接在 XHR 请求中执行转换。

于 2013-05-16T21:34:51.767 回答