2013-07-05 3 views
1

안녕하세요, 백본에서 어디에서 Ajax라는 PHP 파일을 사용하여 예를 들어 GBP에서 EUR로 가격을 변환하고 싶은지 알고 싶습니다. success 함수에서 변환기 데이터를 내 개체에 할당하려고합니다. 그러나 템플릿 uin 밑줄에는 항상 이전 값이 있으므로이 값을 설정하지 않는 것 같습니다. 나는 또한 시도Ajax 요청 내의 백본 집합 모델

toJSON: function() { 
     var json = _.clone(this.attributes); 

     json.rooms = this.rooms.toJSON(); 
     _.each(json.rooms, function(room){ 
      var converter ="<?php echo(site_url('/backend/hotel/ajax_currency')); ?>"; 
      $.ajax({ 
       url: converter, 
       type: "POST", 
       data: { 
         from_currency : room.currency, 
         amount : room.price_adult 
        }, 
       dataType: "json", 
       success: function(data) { 
        console.log(data); 
        room.price_adult = data; 
       } 
      }); 
     }); 
     return json; 
    }, 

: 이 내 모델 안에 내 기능입니다

room.model.set('price_adult',data); 

하지만 나에게 모델을 찾을 수없는 오류를 반환합니다. 어떻게 해결할 수 있습니까?

답변

2

이것은 당신이 JSON 함수에 넣고 싶은 것은 아니며, 왜 당신에게 도움이되는지 몇 가지 이유를 생각할 수 있습니다. 가장 중요한 것은 toJSON 함수가 동기식이며 AJAX 응답이 비동기입니다. 그래서 당신의 렌더링 함수가 당신의 아약스로부터 응답을 받기 전에 일어나고있다.

나는 Ajax가 반환되고 price_adult가 준비되었을 때 뷰를 렌더링 할 것입니다. 동시성을 담당 할 Room 모델을 제안 할 것입니다.

var Room = Backbone.Model.extend({ 
    initialize:function(){ 
     this.convertConcurrency(); 
    }, 
    convertConcurrency:function(){ 
     var model = this; 
     $.ajax(....., 
      success:function(data){ 
       model.set("price_adult", data); 
      } 
     ); 
    }, 
}); 
var RoomView = Backbone.View.extend({ 
    initialize: function(){ 
     this.listenTo(this.model, "change:price_adult", this.render); 
     if (this.model.has("price_adult")) this.render(); 
    }, 
    ..... 
}); 
var Rooms = Backbone.Collection.extend({...}) 
var RoomsView = // Rooms collection view 

이렇게하면 price_adult 준비가 된 경우에만보기가 렌더링됩니다.

서버에서 동시성 정보를 모으고 동시성 대화를 계산하는 모델을 클라이언트에 만들어야합니다. 그러면 하나의 아약스 만 있고 모델은 서버 대신 계산할 것입니다.

+0

고맙습니다. +1 –