0

私は knockoutjs の初心者です。私はjsonデータをkoにマップしようとしていました。これは私のコードです。

json データを解析してテーブルに表示したい。私が ko.compute をしようとしているとき、それは私をスローします self.firstName() は関数ではありません。計算関数の前にコンソールで firstName の値をログに記録しようとすると、json 配列に 3 つの値が出力され、4 回目に実行され、self.firstName が関数ではないというエラーがスローされます。

編集:計算を削除して、jsonのようにデータを印刷するだけで、正しくマップできます。この問題は、計算を使用すると発生します。計算する前に console.log(self.firstName() ) を試してみると、マッピング後に jsonarray に値が出力されますが、3回解析する代わりに、4回と4回解析すると、「関数ではありません」というエラーが表示されます

<div id="employeeList">
 <table border ="2">
  <thead>
   <tr>
<th> First Name</th>
<th> Last Name</th>
<th> Age</th>
<th> Phone</th>
<th> Email</th>
</tr>
</thead>
<tbody  data-bind="foreach:employees">
<tr>
 <td data-bind="text:name"></td>
<td data-bind="text:firstName"></td>
<td data-bind="text:lastName"></td>
<td data-bind="text:age"></td>
<td data-bind="text:phone"></td>
<td data-bind="text:email"></td>
</tr>
</tbody>
</table>

</div>

これは私のjsコードです

     var personMapping={
          'copy':['age'],
          'employees': {
              create: function(options) {
                return new PersonViewModel(options.data);
            }
          }
     };


  function PersonViewModel(data){
      var self=this;
      ko.mapping.fromJS(data,personMapping,this);
       self.name=ko.computed(function(){
          return self.firstName()+' '+self.lastName();
      },this);


  }



var data={employees:
       [{
            firstName: 'Marco',
            lastName: 'Franssen',
            age: 26,
            phone: 12346789,
            email: "a@a.com"    
        },
        {
            firstName: 'Kumar',
            lastName: 'Rangarajan',
            age: 26,
            phone: 123467890,
            email: "a@b.com"
        },
        {
            firstName: 'A',
            lastName: 'B',
            age: 26,
            phone: 6775675567567,
            email: "a@c.com"}]
}

ko.applyBindings(new PersonViewModel(data), $('#employeeList'));


});

これは jsfiddle コードです: http://jsfiddle.net/YfqPs/1/

4

3 に答える 3

0

関連する外部依存関係でjsfiddleを動作させるのに苦労しています..今のところ、マッピングを使用しないか、それを置き換えることを意図したこのマッパーを試すことをお勧めしますhttp://coderenaissance.github.io/ knockout.viewmodel/

私が期待していたのは、オブジェクトのプロパティであるため、オブジェクトcreateのコンテキストから関数を呼び出すことです。personMapping

つまり、以下のコードでは、thisは実際personMappingには ではなく、それ自体にマップしようとしPersonViewModelていると思っていたでしょう。mapping.fromJSpersonMapping

var self=this;
ko.mapping.fromJS(data,personMapping,this);
于 2013-09-30T20:53:53.053 に答える
0

ではdatafirstNameは の下にありemployeesます。

次のように呼び出しを行う必要があるようです。

return new PersonViewModel(options.data.employees);

含まれているビュー モデルはko.computed、1 人の従業員を受け入れて計算を行う必要があります。

function PersonViewModel(employee){
   var self=this;
   self.name=ko.computed(function(){
      return self.firstName()+' '+self.lastName();
  },this);
}

jsフィドル

于 2013-09-30T20:05:11.787 に答える