0

RESTAPIからのJSON配列があります。Knockoutマッピングプラグインを使用して配列を処理し、JSONを事前設定されたフォーム値にロードしています(ユーザーが以前にフォームに値を追加した場合-Knockout配列をテストするためのデータがあります)。このフォームは基本的に、入力を含むdivブロックを追加または削除するため、ユーザーは「作業」エクスペリエンスを追加/削除できます。

私の問題は、プラグインが配列をマップする方法を解読しようとすることです。配列内の行の特定の値(id)を見つけようとしているので、それを変数として追加して、APIにその特定の行を削除するように指示できます。Knockoutにhtmlの行の値を明示的に出力させることはできますが、それ以外の方法でそれをキャプチャする方法を理解することはできません。テンプレート「foreach」には、「remove:」を参照するボタンがあり、配列から値をキャプチャしようとして立ち往生しています。

たとえば、HTMLの場合:

これにより、「作業」オブジェクトの2つの行が問題なく出力されます。

<span data-bind="text: ko.mapping.toJSON(workModel.work())"></span>

[{"id":"1","schoolID":"2","place":"","position":"Science Teacher","description":"I worked at ASD for 1 year as a Science teacher.","start":"2011","end":"2012","profileID":"91"},{"id":"2","schoolID":"1","place":"American School of Taiwan","position":"Science Guy","description":"I was just another science guy","start":"2008","end":"2011","profileID":"91"}]

これにより、配列の最初の行と項目のIDが出力されます。

<span data-bind="text: ko.mapping.toJSON(workModel.work()[0].id)"></span>
"1"

しかし、JavaScriptでは、foreachテンプレートによって生成された削除ボタンをクリックすると...

gone = function(work) {

        alert(ko.mapping.toJSON(workModel.work(this).id)); 

     } 

Firebugでこのエラーが発生すると、UIがリロードされ、クリックしたテンプレートブロックがドロップアウトされます。

Unable to parse bindings. Message: TypeError: workModel.work()[0] is undefined; Bindings value: text: ko.mapping.toJSON(workModel.work()[0].id)

ただし、上記のアラートを明示的なステートメントに置き換えると、次のようになります。

gone = function(work) {

         alert(ko.mapping.toJSON(workModel.work()[0].id)); 

         } 

正しい値の「1」をもう一度取得します。コードの「this」の側面に関係していることは知っていますが、配列から特定の値をキャプチャできるように、マッピングプラグインが何をしているのかわかりません...意味がありますか?どんな助けでも大歓迎です。

4

2 に答える 2

0

私はここで手足に出かけますが、これは問題だと思います。Javascriptでのスコープは、面倒な場合があります。going-functionを含むスコープで次のようなことを試してください。

var self = this;
gone = function(work) {
    alert(ko.mapping.toJSON(workModel.work(self).id)); 
} 

免責事項:私は今これを自分でテストすることはできませんが、試してみてください:)

于 2012-07-31T08:18:39.920 に答える
0

やっと手に入れました。これは、Stack Overflow と Knockout フォーラムのさまざまな投稿を組み合わせたものです。他の人がこれよりもエレガントなソリューションを持っていると確信していますが、私にとってはうまくいきます。

「削除」(または値を取得するために使用するボタン)ボタンの foreach ループで、データバインドに次を含めました。

<a href="" class="btn" data-bind="click: function() { remove($data.id()); }">Remove</a> 

次に、私が持っているJavaScriptで:

var self = this;
var row_id;

self.remove = function(index){
            var row_id = index;
            alert(row_id);

    }

アラートは、ロードされた JSON の行 ID を希望どおりに返します。$data.id() を変更/使用して、ロードされた JSON からマップされた要素を返すことができます。その場合、row_id はグローバルであり、他の場所でもアクセスできます。

于 2012-08-02T06:07:30.363 に答える