mat*_*ser 2 javascript knockout.js
我试图强制UI更新修改一个对象的值observableArray,但数组中的对象不是observable.我以为你可以这样做valueHasMutated,但它没有像我预期的那样工作.
在这个例子中,如果我单击更新按钮没有任何反应,但如果我手动重置数组,它会更新:
<div id="bindings">
<ul data-bind="foreach: observableThings">
<li data-bind="text: id"></li>
</ul>
</div>
<button data-bind="click: updateValue">Update</button>
<button data-bind="click: forceUpdate">Force Update</button>
Run Code Online (Sandbox Code Playgroud)
var things = [
{ id: 1, thing: false },
{ id: 2, thing: false },
{ id: 3, thing: false },
{ id: 4, thing: false }
]
var viewModel = function() {
var self = this;
self.observableThings = ko.observableArray(things);
self.updateValue = function() {
self.observableThings()[0].id = 5;
self.observableThings.valueHasMutated();
}
self.forceUpdate = function() {
self.observableThings()[0].id = 5;
var origThings = self.observableThings();
self.observableThings(null);
self.observableThings(origThings);
}
}
ko.applyBindings(new viewModel());
Run Code Online (Sandbox Code Playgroud)
该怎么valueHasMutated办?
将一堆普通对象粘贴到可观察数组中并不会神奇地使这些对象的属性可观察.
可观察数组通常仅观察项目移除和项目插入.如果项目本身具有您想要观察的属性,则显式地需要使这些属性可观察.
该映射插件可以与帮助.它可以做一些非常好的事情,请阅读文档页面.
function ListOfThings(params) {
var self = this;
self.things = ko.observableArray();
self.updateValue = function() {
ko.utils.arrayForEach(self.things(), function (thing) {
thing.id( ~~(Math.random() * 100) );
});
}
// init
ko.mapping.fromJS(params, {}, self);
}
var vm = new ListOfThings({
things: [
{ id: 1, thing: false },
{ id: 2, thing: false },
{ id: 3, thing: false },
{ id: 4, thing: false }
]
});
ko.applyBindings(vm);Run Code Online (Sandbox Code Playgroud)
<script src="https://cdnjs.cloudflare.com/ajax/libs/knockout/3.4.0/knockout-min.js"></script>
<script src="https://cdnjs.cloudflare.com/ajax/libs/knockout.mapping/2.4.1/knockout.mapping.min.js"></script>
<div id="bindings">
<ul data-bind="foreach: things">
<li data-bind="text: id"></li>
</ul>
</div>
<button data-bind="click: updateValue">Update</button>
<hr>
<pre data-bind="text: ko.toJSON($root, null, 2)"></pre>Run Code Online (Sandbox Code Playgroud)
编辑您似乎不成比例地修复valueHasMutated了使用映射插件的不可能性.映射插件很有用,但肯定没有必要.
function Thing(params) {
this.id = ko.observable(params.id);
this.thing = ko.observable(params.thing);
}
function ListOfThings(params) {
var self = this;
self.things = ko.observableArray();
self.updateValue = function() {
ko.utils.arrayForEach(self.things(), function (thing) {
thing.id( ~~(Math.random() * 100) );
});
}
// init
self.things(ko.utils.arrayMap(params.things, function (obj) {
return new Thing(obj);
}));
}
var vm = new ListOfThings({
things: [
{ id: 1, thing: false },
{ id: 2, thing: false },
{ id: 3, thing: false },
{ id: 4, thing: false }
]
});
ko.applyBindings(vm);Run Code Online (Sandbox Code Playgroud)
<script src="https://cdnjs.cloudflare.com/ajax/libs/knockout/3.4.0/knockout-min.js"></script>
<div id="bindings">
<ul data-bind="foreach: things">
<li data-bind="text: id"></li>
</ul>
</div>
<button data-bind="click: updateValue">Update</button>
<hr>
<pre data-bind="text: ko.toJSON($root, null, 2)"></pre>Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
3570 次 |
| 最近记录: |