2017-10-20 10 views
1

페이지가 처음로드 될 때 viewModel을 어떻게 초기화합니까?ajax 검색 결과가 돌아온 후 viewmodel 초기화 및 새로 고침

Ajax 호출에서 새로 고침을 수행하면 Ajax 호출 후에 데이터가 올바르게 작동하지만 첫 번째로드에서는 모델을 알 수 없습니다.

var viewModel = {}; 
     $("#searchButton").click(function() { 
        var tc= $("#tc").val(); 
        var y= $("#y").val(); 
        $.ajax({ 
         url: "Search/?t=" + tc+ "&y=" + y, 
         type:'GET', 
         dataType: 'json', 
             success: function (result) { 
          viewModel = new TourViewModel(result); 
          ko.applyBindings(viewModel); 
         } 
        }); 
       }); 

       function TourViewModel(data) { 
        var self = this; 
        var tourMapping = {}; 

        self.selectedItem = ko.observable(""); 
        self.lastSavedJson = ko.observable(""); 
        self.saveMe = function() { 
                  viewModel.selectedItem(this); 
         self.lastSavedJson(JSON.stringify(ko.toJS(self.selectedItem), null, 2)); 
         $.ajax({ 
          url: "SaveTour", 
          data: ko.toJSON({ tour:ko.toJS(self.selectedItem) }), 
          type: "post", 
          contentType: "application/json", 
          success: function (result) 
           { alert(result) } 
         }); 

        } 

        selectItem = function() { 
         self.selectedItem(this); 
        } 

        ko.mapping.fromJS(data, tourMapping, self); 


       }; 

답변

0

다음은 매우 기본적인 예입니다. 아약스 호출을 한 다음 결과를 사용하여 모델을 초기화하십시오.

var ViewModel = function(r) { 
 
    var self = this; 
 
    this.Beers = ko.observableArray(r.map(function(beer) { 
 
    return new BeersModel(beer); 
 
    })); 
 
    this.RefreshBeer = function() { 
 
    self.Beers([]); 
 
    GetBeer() 
 
     .then(function(response) { 
 
     self.Beers(response.map(function(beer) { 
 
      return new BeersModel(beer); 
 
     })) 
 
     }); 
 
    } 
 
} 
 

 
var BeersModel = function(r) { 
 
    this.name = r.name; 
 
} 
 

 
var GetBeer = function() { 
 
    return $.ajax({ 
 
    url: 'https://api.punkapi.com/v2/beers', 
 
    method: 'GET' 
 
    }) 
 
} 
 

 
// Do init ajax stuff, and load viewModel 
 
GetBeer() 
 
    .then(function(response) { 
 
    var model = new ViewModel(response); 
 
    ko.applyBindings(model); 
 
    });
<script src="https://ajax.googleapis.com/ajax/libs/jquery/2.1.1/jquery.min.js"></script> 
 
<script src="https://cdnjs.cloudflare.com/ajax/libs/knockout/3.4.2/knockout-min.js"></script> 
 

 
<button data-bind="click: RefreshBeer">Refresh Beer</button> 
 
<!-- ko if: Beers() --> 
 
<ul> 
 
    <!-- ko foreach: Beers --> 
 
    <li> 
 
    <span data-bind="text: name"></span> 
 
    </li> 
 
    <!-- /ko --> 
 
</ul> 
 
<!-- /ko -->

+0

감사합니다. 페이지로드시 결과를 표시하지 않고 새로 고침을 클릭 할 때만 결과를 표시하려면 어떻게해야합니까? 내 페이지에 페이지로드에 대한 결과가 없지만 "검색"결과가로드 될 것입니다.하지만 아약스 호출 결과에서 바인드하면 뷰는 이전에 viewmodel에 대해 알지 못합니다 – user8808262

+0

글쎄, 당신은 내가 한 일을하고 .then() 메소드의 내용을 실행하기 전에 ajax 메소드의 결과를 기다리는 GetBeer(). then()을 사용하십시오. 그렇게하면 데이터가 있음을 알게되고 그 시점 이후에 viewModel을 인스턴스화합니다. 과 같은 HTML 조건문이 필요할 수도 있습니다. 실제로 반환 된 데이터가없는 경우 물건이 터지도록하십시오. – Budhead2004

+0

도움 주셔서 감사합니다. 도움이되었습니다. – user8808262