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