【发布时间】:2017-02-19 03:25:13
【问题描述】:
我有一个简单的 HTML 标记,其中包含我的视图模型列表和模板。另外,我在<pre> 部分有我的视图模型:
<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 数组中看到它。问题是,当我在嵌套视图模型中更改某些值时,例如键入新的姓氏,无论如何,Names 数组中当前视图模型的 <pre> 部分没有变化。
如何制作真正可观察的可观察数组?添加这样的组件最有利可图的方法是什么?我已经完成了可观察的嵌套视图模型,但它似乎不起作用。
【问题讨论】:
-
我认为这里的问题是淘汰 observableArray 将数组本身视为可观察的,通知推送和删除等事件,但不会通知数组中某个项目的单个属性发生变化。我很确定您将自己实现(文档中有一个“关键点”非常简短地提到了这一点 - knockoutjs.com/documentation/observableArrays.html)
-
@NickDeFazio 但是在
addName方法中,我添加了ko.observable,这还不够吗?
标签: knockout.js viewmodel observable