私は単純なHTMLマークアップを持っていて、その中のビューモデルとテンプレートのリストを持っています。また、私は<pre>
セクションで私のviewmodelを持っている:それは良い作品観測可能な配列の観察可能なビューモデルはKnockoutJsでは動作しません
<div class="container">
<div class="row">
<div class="col-md-6">
<div class="col-md-12">
<div class="panel panel-primary">
<div class="panel-heading">
Names
<button type="button" class="btn btn-link" data-bind="click: addName">
<span class="glyphicon glyphicon-plus"></span>
</button>
</div>
<div class="panel-body">
<ul class="list-group" id="namesList" data-bind="foreach: Names">
<li class="list-group-item"><my-comp></my-comp></li>
</ul>
</div>
</div>
</div>
</div>
<div class="col-md-6">
<div class="col-md-12">
<pre data-bind="text: ko.toJSON(Names, null, 2)"></pre>
</div>
</div>
</div>
</div>
<script type="text/html" id="fullNameTmpl">
<p>First name: <strong data-bind="text: firstName"></strong></p>
<p>Last name: <strong data-bind="text: lastName"></strong></p>
<p>First name: <input data-bind="textInput: firstName" /></p>
<p>Last name: <input data-bind="textInput: lastName" /></p>
<p>Full name: <input data-bind="textInput: fullName"></p>
<button data-bind="click: capitalizeLastName">Go caps</button>
</script>
<script>
function AppViewModel() {
var self = this;
self.firstName = ko.observable("Bert");
self.lastName = ko.observable("Bertington");
this.fullName = ko.pureComputed({
read: function() {
return self.firstName() + " " + self.lastName();
},
write: function (value) {
var lastSpacePos = value.lastIndexOf(" ");
if (lastSpacePos > 0) {
self.firstName(value.substring(0, lastSpacePos));
self.lastName(value.substring(lastSpacePos + 1));
}
},
owner: self
});
self.capitalizeLastName = function() {
var currentVal = this.lastName();
this.lastName(currentVal.toUpperCase());
};
}
ko.components.register('my-comp', {
viewModel: AppViewModel,
template: { element: "fullNameTmpl" }
});
function NamesViewModel() {
var self = this;
self.Names = ko.observableArray();
self.addName = function() {
var vm = ko.observable(new AppViewModel());
self.Names.push(vm);
}
}
ko.applyBindings(new NamesViewModel());
</script>
、私はリストに項目を追加することができますし、これらの項目でデータバインディングが動作します。新しいAppViewModel
を追加すると、<pre>
セクションのNames
アレイに表示されます。問題は、新しい姓を入力するのと同じように、ネストされたビューモデルでいくつかの値を変更するときに、現在のビューモデルの<pre>
セクションの変更がNames
配列にないことです。
本当に観測可能な観測値の配列を作成するにはどうすればよいですか?このようなコンポーネントを追加する最も収益性の高い方法は何ですか?私はすでに観察可能なネストされたビューモデルを実行しましたが、うまくいかないようです。
私はここでの問題は、プッシュのようなイベントに通知し、obversableとして配列自体を扱い、削除observableArrayそのノックアウトがあるが、配列内のアイテムの単一のプロパティ場合は通知しないだろうと思い変更。私はあなたがそれを自分で実装することを余儀なくされていると確信しています(ドキュメントには、これを非常に簡単に言及する "重要なポイント" http://knockoutjs.com/documentation/observableArraysがあります)。html) –
@NickDeFazioですが、 'addName'メソッドでは、' ko.observable'を追加します。これで十分ですか? –