2015-02-19 2 views
0

Я пытаюсь передать выбранный элемент viewmodel в функцию сохранения. Функция save вызывается, но выбранные элементы viewmodel теряются или не передаются. Не знаете, как это сделать. Если я проверил this.ames, он не определен. Я проделал этот пример почти точно.Knockout js on click pass selected viewmodel item

<div data-bind="foreach: games, visible: games().length > 0"> 
    <div class="row clearRight borderBottom"> 
     <div class="col-sm-12 col-md-12 col-lg-12"> 
      <label class="" data-bind="text: gameDate"></label>/Time: 
      <label class="" data-bind="text: gameTimeET"></label>/Tv Station: 
      <label class="" data-bind="text: tvStation"></label> 
     </div> 
     <div id="mode-group" class="btn-group btn-group-lg btn-group-justified" data-toggle="buttons"> 
      <div class="col-sm-12 col-md-4 col-lg-4 text-center"> 
       <label class="btn btn-default" data-bind="click: $parent.save.bind($parent)" "> 
<input type=" radio" data-bind="attr: { value: awayTeam, name: gameId, id: 'a' + gameId() }"> 
        <img data-bind="attr: { src: awayTeamLogoUrl, alt: awayTeamFullName }" style="height: 100px; width: 150px;" /><br /> 
        <label data-bind="text: awayTeamFullName"></label> 
       </label> 
      </div> 
      <div class="col-sm-12 col-md-2 col-lg-2 text-center" style="padding-top: 50px;">AT</div> 
      <div class="col-sm-12 col-md-4 col-lg-4 text-center"> 
       <label class="btn btn-default" data-bind="click: $parent.save.bind($parent)" "> 
<input type=" radio" data-bind="attr: { value: homeTeam, name: gameId, id: 'h' + gameId() } "> 
        <img data-bind="attr: { src: homeTeamLogoUrl, alt: homeTeamFullName }" style="height: 100px; width: 150px;" /><br /> 
        <label data-bind="text: homeTeamFullName"></label> 
       </label> 
      </div> 
     </div> 
    </div> 
</div> 

function Game(data) { 
    this.gameId = ko.observable(data.GameId); 
    this.gameWeek = ko.observable(data.GameWeek); 
    this.awayTeam = ko.observable(data.AwayTeam); 
    this.homeTeam = ko.observable(data.HomeTeam); 
    this.gameDate = ko.observable(data.GameDate); 
    this.gameTimeET = ko.observable(data.GameTimeET); 
    this.tvStation = ko.observable(data.TvStation); 
    this.awayTeamLogoUrl = ko.observable(data.AwayTeamLogoUrl); 
    this.homeTeamLogoUrl = ko.observable(data.HomeTeamLogoUrl); 
    this.awayTeamFullName = ko.observable(data.AwayTeamFullName); 
    this.homeTeamFullName = ko.observable(data.HomeTeamFullName); 
    this.winner = ko.observable(""); 
} 

function GamesListViewModel() { 
    var self = this; 
    self.games = ko.observableArray([]); 
    self.gameId = ko.observable(); 
    self.gaemWeek = ko.observable(); 
    self.awayTeam = ko.observable(); 
    self.homeTeam = ko.observable(); 
    self.gameDate = ko.observable(); 
    self.gameTimeET = ko.observable(); 
    self.tvStation = ko.observable(); 
    self.awayTeamLogoUrl = ko.observable(); 
    self.homeTeamLogoUrl = ko.observable(); 
    self.awayTeamFullName = ko.observable(); 
    self.homeTeamFullName = ko.observable(); 
    self.winner = ko.observable(); 

    self.save = function() {  

     $.ajax("/Pick/Create", { 
      data: { 
       json: ko.toJSON({ 
        games: this.games 
       }) 
      }, 
      type: "POST", 
      dataType: 'json', 
      success: function (result) { 
       alert(ko.toJSON(this.games)) 
      } 
     }); 
    }; 

    $.ajax({ 
     url: "/Pick/GameDetail?weekId=7", 
     //data: { codetype: codeType, filter: filter }, 
     type: "POST", 
     dataType: 'json', 
     success: function (data) { 
      var mappedGames = $.map(data.g, function (item) { 
       return new Game(item); 
      }); 

      self.games(mappedGames); 
     }, 
     error: function (requestObject, error, errorThrown) { 
      var errorMessage = requestObject; 
     } 
    }); 

} 

ko.applyBindings(new GamesListViewModel()); 

ответ

1

Использование data-bind="click: $parent.save.bind($parent, $data)" в качестве мыши привязке и изменить save обработчика получить выбранную игру из щелчка связывания в качестве аргумента:

self.save = function (selectedGame) { 
     $.ajax("/Pick/Create", { 
      data: { 
       json: ko.toJSON({ 
        games: selectedGame 
       }) 
      }, 
      type: "POST", 
      dataType: 'json', 
      success: function (result) { 
       alert(ko.toJSON(self.games)) 
      } 
     }); 
    }; 
+0

Я triied «$ parent.save», и он не сделал работайте. –

+0

Поцарапайте это, теперь я знаю, где ваша проблема ... Я уточню свой ответ. – janfoeh

+0

self.games возвращает все игры, которые не выбраны. –