2017-04-18 29 views
0

サンプルを実行しようとしましたが、コンソールエラーが発生しました。でknockoutjsで "キャッチされていないエラー:バインディングを解析できません"というエラーが発生しましたが、コードが機能します

ここ

Uncaught Error: Unable to parse bindings. Message: ReferenceError: loadUserData is not defined; Bindings value: click: loadUserData

コード、

<form action="#" method="post"> 
    <p>First name: <input data-bind='value: firstName' /></p> 
    <p>Last name: <input data-bind='value: lastName' /></p> 
    <div> 
     Your favorite food: 
     <select data-bind='options: activities, value: favoriteHobby'></select> 
    </div> 
    <p><button data-bind='click: loadUserData'>Load data</button></p> 
    <p><button data-bind='click: saveUserData'>Save Data</button></p> 
</form> 
<script> 
    function PersonViewModel() { 
     var self = this; 
     self.firstName = ""; 
     self.lastName = ""; 
     self.activities = []; 
     self.favoriteHobby = ""; 
     self.loadUserData = function() { 
      $.getJSON("/get-user-data.json", function (data) { 
       var viewModel = ko.mapping.fromJS(data); 
       ko.applyBindings(viewModel); 
      }); 
     } 
     self.saveUserData = function() { 
      var data_to_send = { userData: ko.toJSON(self) }; 
      $.post("/save-user-data", data_to_send, function (data) { 
       alert("Your data has been posted to the server!"); 
      }).fail(function() { 
       alert("Ensure the Url before save the data"); 
      }); 
     } 
    } 
    ko.applyBindings(new PersonViewModel()); 
</script> 

取得 - ユーザーdata.jsonを

{ 
    "firstName": "John", 
    "lastName": "Smith", 
    "activities": [ "Golf", "Kayaking", "Web Development" ], 
    "favoriteHobby": "Golf" 
} 

ボタンをエラー破壊に対する負荷データをクリックしますが、サンプル作品ながら、どのようにこのエラーをクリアします。

+1

ノックアウトでは、観測値を使用してUIを更新します。 'loadUserData'のコールバックのように、バインディングを2回適用することはできません**。私はチュートリアルを見て、あなたのビューモデルをサーバーからのデータでどのように更新すべきかを知ることをお勧めします。 – user3297291

答えて

0

@ user3297291で指摘したように、ko.applyBindingsを2回呼び出すことはできません。代わりに、あなたのビューモデルのプロパティをノックアウトオブザーバブルにすると、ノックアウトはあなたのUIを自動的に更新します:

function PersonViewModel() { 
    var self = this; 
    self.firstName = ko.observable(); 
    self.lastName = ko.observable(); 
    self.activities = ko.observableArray(); 
    self.favoriteHobby = ko.observable(); 
    self.loadUserData = function() { 
     return $.getJSON("/get-user-data.json", function (result) { 
      self.firstName(result.firstName) 
       .lastName(result.lastName) 
       .favoriteHobby(result.favoriteHobby) 
       .activites(result.activities); 
     }); 
    } 
} 
ko.applyBindings(new PersonViewModel()); 
関連する問題