2017-10-20 107 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

這是一個相當基本的例子。做你的ajax調用,然後使用結果初始化模型。

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

感謝。儘管如何讓它在頁面加載時不顯示任何結果,並且只需點擊refreshbeer就可以顯示?我的頁面在頁面加載時不會有任何結果,但點擊「搜索」結果將被加載,但是如果我在ajax調用返回中綁定,那麼在此之前視圖並不知道視圖模型 – user8808262

+0

那麼,你做我所做的和在執行.then()方法的內容之前使用GetBeer()。then()等待ajax方法的結果。這樣你就知道你有數據,並在那之後實例化viewModel。如果數據 - >可能需要html條件,如<! - ko,以確保如果實際上沒有返回任何數據,則不會爆炸。 – Budhead2004

+0

謝謝你的幫助。這有幫助。 – user8808262