2012-03-01 7 views
0

私はMVC4アプリケーションでうまく動作する以下のJavascriptとHtmlコードを持っています。

@model string 
<script src="@this.Url.Content("~/Scripts/jquery-1.7.1.min.js")" type="text/javascript"> </script> 
<script src="@this.Url.Content("~/Scripts/jquery.signalR.js")" type="text/javascript"> </script> 
<script src="@this.Url.Content("~/Scripts/knockout.js")" type="text/javascript"> </script> 
<script src="@this.Url.Content("~/Scripts/knockout.mapping-latest.js")" type="text/javascript"> </script> 
<script type="text/javascript" src="/signalr/hubs"> </script> 
<script type="text/javascript"> 
    $(function() { 
     function outingDataViewModel() { 
      var self = this; 
      self.hub = $.connection.outings; 
      self.ID = ko.observable(); 
      self.OutingNumber = ko.observable(); 
      self.OutingName = ko.observable(); 
      //Initializes the view model 
      self.init = function() { 
       self.hub.getOuting('@this.Model'); 
      }; 
      self.hub.updateOuting = function (data) {      
       self.ID(data.ID); 
       self.OutingName(data.OutingName); 
       self.OutingNumber(data.OutingNumber); 
      }; 

      self.updateOuting = function() { 
       var outing = { "ID": self.ID(), "OutingNumber": self.OutingNumber(), "OutingName": self.OutingName() }; 
       self.hub.saveOuting(outing); 
      }; 
     } 

     var vm = new outingDataViewModel(); 
     ko.applyBindings(vm); 
     // Start the connection 
     $.connection.hub.start(function() { vm.init(); }); 
     $('.data').change(function() { vm.updateOuting();}); 
    }); 
</script> 

<div id="OutingSummary"> 
    <div data-bind="text:OutingNumber"></div> 
    <input data-bind="value:OutingName" class="data"/> 
</div> 

しかし、私は私の$以下を実行してマッピングを実装しようとする変更(機能(){vm.updateOuting();})( 'データ。')。決して呼ばれない。 Chromeデベロッパーツールでエラーが発生していないようで、私は迷っています。情報はhtmlにバインドされ、テキストボックスからタブアウトしても何も起こりません。 (以前と同じスクリプト参照)

答えて

1

JSFiddleは問題の原因を正確に伝えるのは難しいですか? applyBindings、Outing()を呼び出した時点で、あなたがバインドする前に、Outingに値が設定されていないようです。OutingNameは未定義です。コンソールにjsエラーがありますか?

ノックアウト値バインディングは内部的にchangeイベントを使用して、そのオブザーバブルを更新します。したがって、ほとんどの場合、Jqueryの変更イベントを使用する必要はありません。あなたがOutingNameへの値バインディングを既に行っているので、change()メソッドをoutingDataViewModel内のこれで置き換えてみませんか?

self.Outing().OutingName.subscribe(function() { 
    self.updateOuting(); 
}); 

ここでEDIT

は働く簡易版です。私はあなたのupdateOutingメソッドがOuting observableを呼び出してからその名前にアクセスしていないことに気付きました。これにより、通常はエラーが発生します。私は前にそれを使用したことがないので、信号Rのものを含めなかった。

http://jsfiddle.net/madcapnmckay/gDu94/

・ホープこれはあなたが観測について絶対的に正しい

+0

、役立ちます....私はjQueryを使ってそれをやっている理由は、原因となる複数のテキストボックス数十があるように起こっていることです最終製品に保存してください。それらのクラスにすべて「データ」のクラスを与え、それらをすべて一回で拘束するほうがずっと簡単です。 – PlTaylor

+0

ああ、1つのJqueryセレクタを使用してたくさんの購読を避けたいと思っています。 – madcapnmckay

+0

あなたはself.hub.updateOutについて正しくあります。これは$( 'data')呼び出しが必要です。 – PlTaylor

関連する問題