0

私はそれらのプロパティを表示しているオブジェクトの配列を持っています。 個々の編集機能を追加するにはどうすればよいですか?リストの各要素の編集ボタンであると言います。knockout.js observablesの配列を作成する方法は?

オブジェクトが編集モードのときに、テキストフィールドの代わりに入力フィールドを表示したいと思っています。これは可視バインディングを使用しています。だから私はそれぞれのブールオブザーバブルが必要です。

リストの要素の量を知らずにこれを行うにはどうすればよいですか...私も追加と削除があるので、新しい要素が作成されるたびに、この配列にオブザーバブルを追加する必要があります。

私はオブジェクトにko.observable要素を与えようとしましたが、これはできませんでした。

+1

、 '注5:動的に使用されているテンプレートの選択' で、アイデアがありますあなたの問題を解決する2つのテンプレート、1つは編集モード、もう1つは読み取りモードです。他のオプションは 'if'バインディングを使用することです(http://knockoutjs.com/documentation/if-binding.html)。お役に立てれば。 –

+0

ありがとう@JoseLuis、私はテンプレートについて読むよ!しかし、あなたは、もしあなたがそれをどうやって「結びつける」ことができるかについてもっと教えてもらえますか? –

+1

このリンク(http://www.knockmeout.net/2011/03/guard-your-model-accept-or-cancel-edits.html)があなたの質問に答えます。 :-) –

答えて

1

私はobservableArrayの中のオブジェクトを使いたいです。次に、必要に応じて多くの行に対してインライン編集機能を使用する例を示します。このリンク、http://knockoutjs.com/documentation/template-binding.htmlで

function Employee(emp) { 
 
    var self = this; 
 
    self.Name = ko.observable(emp.Name); 
 
    self.Age = ko.observable(emp.Age); 
 
    self.Salary = ko.observable(emp.Salary); 
 
    self.EditMode = ko.observable(emp.EditMode); 
 
    self.ChangeMode = function() { 
 
    self.EditMode(!self.EditMode()); 
 
    } 
 
} 
 

 
function viewModel() { 
 
    var self = this; 
 
    self.Employees = ko.observableArray() 
 
    self.Employees.push(new Employee({ 
 
    Name: "Joe", 
 
    Age: 20, 
 
    Salary: 100, 
 
    EditMode: false 
 
    })); 
 

 
    self.Employees.push(new Employee({ 
 
    Name: "Steve", 
 
    Age: 22, 
 
    Salary: 121, 
 
    EditMode: false 
 
    })); 
 

 
    self.Employees.push(new Employee({ 
 
    Name: "Tom", 
 
    Age: 24, 
 
    Salary: 110, 
 
    EditMode: false 
 
    })); 
 
} 
 
var VM = new viewModel(); 
 
ko.applyBindings(VM);
<script src="https://cdnjs.cloudflare.com/ajax/libs/knockout/3.4.2/knockout-min.js"></script> 
 
<table border=1> 
 
    <thead> 
 
    <tr> 
 
     <th>Name</th> 
 
     <th>Age</th> 
 
     <th>Salary</th> 
 
     <th></th> 
 
    </tr> 
 
    </thead> 
 
    <tbody data-bind="foreach: Employees"> 
 
    <tr data-bind="if: !EditMode()"> 
 
     <td data-bind="text: Name"></td> 
 
     <td data-bind="text: Age"></td> 
 
     <td data-bind="text: Salary"></td> 
 
     <td><button data-bind="click: ChangeMode">Edit</button></td> 
 
    </tr> 
 
    <tr data-bind="if: EditMode()"> 
 
     <td> 
 
     <input data-bind="value: Name"> 
 
     </td> 
 
     <td> 
 
     <input data-bind="value: Age"> 
 
     </td> 
 
     <td> 
 
     <input data-bind="value: Salary"> 
 
     </td> 
 
     <td><button data-bind="click:ChangeMode">Save</button></td> 
 
    </tr> 
 
    </tbody> 
 
</table>

+0

非常に便利ですが、私が言ったように編集を行うことができましたが、後で私のオブジェクトをJSON(そして明らかにEditMode変数なし)に変換する必要があります。私はしようとしました: 'var unmapped = ko.mapping.toJS(self.editedResources());' それは言う:未定義またはヌル参照のプロパティ 'toJS'を取得することができません。 .... self.editedResources ys私の観測可能な配列 –

+0

@DiegoAstiazaránそれは 'ko.toJS()'または 'ko.toJSON()'であなたは[delete](https://developer.mozilla.org/en- US/docs/Web/JavaScript/Reference/Operators/delete)js/jsonでプロパティを一度削除する –

関連する問題