2012-11-14 100 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