私はこれを見つけましたが、これは私にはうまくいきません:文字列の単純な配列にバインドします
ノックアウトを介して文字列の配列を管理しようとしています。これが私のマークアップです:
<div class="editor-field">
<table>
<thead>
<tr>
<th>Page Urls</th>
<th></th>
</tr>
</thead>
<!-- ko if: RouteUrls().length > 0 -->
<tbody data-bind="foreach: RouteUrls">
<tr>
<td><span data-bind="text: $data"></span></td>
<td><a href="#" class="ui-icon ui-icon-closethick" data-bind="click: $root.removeUrl">Remove</a></td>
</tr>
</tbody>
<!-- /ko -->
<!-- ko if: RouteUrls().length < 1 -->
<tbody>
<tr>
<td colspan="3"> No urls added for editing.</td>
</tr>
</tbody>
<!-- /ko -->
</table>
@Html.HiddenFor(x => x.UrlCount, new { data_bind = "value:RouteUrls().length" })
@Html.ValidationMessageFor(x => x.UrlCount)
</div>
そして、これが私のノックアウトコードです:
<script type="text/javascript">
var mappedModel = ko.mapping.fromJS(@Html.Raw(JsonConvert.SerializeObject(Model)));
mappedModel.RouteUrls = ko.observableArray([]);
mappedModel.urlToAdd = ko.observable("/");
mappedModel.addUrl = function() {
var duplicateValues = ko.utils.arrayFilter(this.RouteUrls(), function (item) {
return item == mappedModel.urlToAdd();
});
if ((this.urlToAdd() != "") && (duplicateValues.length == 0)) // Prevent blanks and duplicates
{
this.RouteUrls().push(this.urlToAdd());
this.urlToAdd("/");
console.log(this.RouteUrls().length);
console.log(this.RouteUrls());
}
};
mappedModel.removeUrl = function(url) {
mappedModel.RouteUrls.remove(url);
};
//other code...
ko.applyBindings(mappedModel);
$.validator.unobtrusive.parse("#pageCForm");
$("#pageForm").data("validator").settings.submitHandler = mappedModel.save;
</script>
問題は、私のマークアップでは、コレクションが表示されないことです。URLを追加しようとすると、条件付きでノックアウトを削除してテーブルを表示しただけでも、常に空になります。ページを送信しようとすると、URLカウントの非表示フィールドで目立たない検証が実行され、空のように動作します。したがって、マークアップ内のすべてRouteUrls()
が常に空のように動作しています。しかし、RouteUrls()。lengthとテキストをコンソールに記録すると、次のように追加しようとすると、次のようになります。
1
["/sdfsd"]
2
["/sdfsd", "/trgfd"]
3
["/sdfsd", "/trgfd", "/fdfdggdbjn"]
そのため、スクリプトコードで長さと配列が適切に入力される方法がわかりませんが、マークアップに反映されていません。何か助けはありますか?