2012-11-14 58 views
3

我是Ember的新手,我在从URL加载JSON时遇到问题。下面是我有:无法在Ember.js中加载外部JSON

var App = Ember.Application.create(); 

App.ApplicationController = Ember.Controller.extend(); 
App.ApplicationView = Ember.View.extend({ templateName: 'application' }); 

App.OrdersListController = Ember.Controller.extend(); 
App.OrdersListView = Ember.View.extend({ templateName: 'orders' }); 

App.Order = Ember.Object.extend(); 
App.Order.reopenClass({ 
    find: function(){ 
    //not implemented yet 
    }, 
    findAll: function(){ 
     var content = []; 
     $.ajax({ 
     url: 'http://api.domain/orders', 
     dataType: 'jsonp', 
     success: function(response){ 
     response.data.forEach(function(order){ 
      this.content.addObject(App.Order.create(order)) 
     }, this) 
     } 
    }); 
    return this.content; 
    } 
}); 

App.Router = Ember.Router.extend({ 
    enableLogging: true, 
    // The initial state for the router, contains every other. 
    root: Ember.Route.extend({ 
    goOrders: Ember.Route.transitionTo('orders'), 
    goLocations: Ember.Route.transitionTo('locations'), 
    goReports: Ember.Route.transitionTo('reports'), 
    goUsers: Ember.Route.transitionTo('users'), 
    goHelp: Ember.Route.transitionTo('help'), 
    //Authenticated routes 
    index: Ember.Route.extend({ 
     route: '/', 
     redirectsTo: 'orders' 
     }), 
    orders: Ember.Route.extend({ 
     route:'/orders', 
     initialState: 'index', 
     //Orders view. 
     index: Ember.Route.extend({ 
     route: '/', 
     connectOutlets: function(router) { 
      router.get('applicationController').connectOutlet({ 
      name:'ordersList', 
      context: App.Order.findAll() 
      }); 
     } 
     }) 
    }) 
    }) 
}); 

App.initialize(); 

在我的模板(简体):

<script type="text/x-handlebars" data-template-name="application"> 
    {{outlet}} 
</script> 

<script type="text/x-handlebars" data-template-name="orders"> 
    {{#each order in controller.content}} 
<p>id: {{order.ord_id}}</p> 
    {{/each}} 
</script> 

有了这个,我不要和错误,但没有显示出来。如果我将他的JSON粘贴到connectOutlet的上下文中,它可以工作。我的findAll()函数有问题吗?

+0

您想要将'App.Order.find()'或'App.store.findAll(App.Order)'传递给'connectOutlets'调用,而不是'App.Order.findAll()' – zentralmaschine

+0

我通过App.store.findAll(App.Order)我得到一个错误:TypeError:'undefined'不是一个对象(评估'App.store.findAll')是不是Ember数据?我没有使用它。 – jabbermonkey

+0

如果我这样做{{#每个顺序在控制器}}我得到这个错误:TypeError:'undefined'不是一个函数(评估'b.addArrayObserver(this)') – jabbermonkey

回答

3

我会尝试这一个:

findAll: function(){ 
     var content = []; 
     $.ajax({ 
     url: 'http://api.domain/orders', 
     dataType: 'jsonp', 
     success: function(response){ 
     response.data.forEach(function(order){ 
      content.addObject(App.Order.create(order)) 
     }, this) 
     } 
    }); 
    return content; 
    } 

正如你看到的,我只是删除了这个指针两次。我认为这个指针在这种情况下指向一个Order类,它没有内容属性。但是你想引用你定义的var。所以它应该没有这个。

注意:在获取数据时,我也不时用这个指针。但是迄今为止,这种结构一直都适用于我。所以它应该工作,但我的解释可能不完美。

+0

我认为内容需要是Order的一个属性,因为在返回数据之前,模板将使用空数组,然后在数据被提取时填充它。数据提取正常。也许我没有正确地与模板绑定? – jabbermonkey

+1

你试过我的方法吗?我猜不会。你基本上说的是,你为每个JSON获取你的订单,并且你想把这些订单设置为你的oder类中的内容。这是错误的。尝试我的方法,你可能会很好。否则发布一个jsFiddle,以便我们可以讨论运行代码。 – mavilein

+0

是的,我试过了,它没有给出错误,但结果相同 - 无法访问数据。 – jabbermonkey