- iOS/Objective-C 元类和类别
- objective-c - -1001 错误,当 NSURLSession 通过 httpproxy 和/etc/hosts
- java - 使用网络类获取 url 地址
- ios - 推送通知中不播放声音
我遇到了一个问题,尝试将 knockoutJS 可观察对象动态更新为计算可观察对象不会更新 UI。
我已经在复选框上实现了父子依赖关系,遵循交互规则。
现在我有一个场景,其中父子依赖行为是动态的,即只有当用户单击按钮时,以上规则才开始工作。
我有一个实现,其中父复选框绑定(bind)到一个可观察的属性,后来该属性被覆盖为一个新的 Computed Observable。更改为 Computed Observable 后,前 2 条规则(规则 1 和 2)起作用,但最后 2 条规则(规则 3 和 4)停止起作用。我可以在调试器中看到返回值已正确返回,但它没有更新 UI。
为了演示我的问题,我创建了 2 个 JS fiddle
我不是在寻找替代解决方案,但我有兴趣了解为什么第二个 fiddle 会出现这种行为。
function ViewModel(){
var self = this;
var childrenArray = [ {isSelected : ko.observable(true)},
{isSelected : ko.observable(true)},
{isSelected : ko.observable(true)},
{isSelected : ko.observable(true)}];
self.parentChildData = {
parentCheckBox: ko.observable(false),
children: ko.observableArray([])
};
self.parentChildData.children(childrenArray);
self.makeDependent = function(){
self.parentChildData.parentCheckBox = ko.computed({
read: function () {
var anyChildUnChecked = ko.utils.arrayFirst(self.parentChildData.children(), function (childCheckBox) {
return !childCheckBox.isSelected();
});
var result = anyChildUnChecked == null;
return result;
//return false;
},
write: function (value) {
ko.utils.arrayForEach(self.parentChildData.children(), function (childCheckBox) {
childCheckBox.isSelected(value);
});
}
})};
return self;
}
ko.applyBindings(new ViewModel());
<script src="https://cdnjs.cloudflare.com/ajax/libs/knockout/3.4.1/knockout-min.js"></script>
<p>
Describes my current implementation for which Rule 3 and 4 are not working. In this case, the Observable property is overridden with the computed Observable on the click of the button. So, initially the parent child relationship is not enforced, but on click of button the relationship is enforced.
</p>
<p>
After clicking the button, the first 2 Rules (Rule 1 and 2) works but last 2 Rule (Rule 3 and 4) stops working. I can see in the debugger that the return value is correctly returned but it doesn't Update the UI.
</p>
<div id="parent">
parent <input type="checkbox" data-bind="checked:parentChildData.parentCheckBox"/>
<br/>
<div id="child">
Child
<!-- ko foreach: parentChildData.children -->
<input type="checkbox" data-bind="checked:isSelected"/>
<!-- /ko -->
</div>
<br/>
<input type="button" value="Make dependent" data-bind="click:makeDependent">
</div>
最佳答案
我想问题出在您的设置初始化时发生的事件序列。在您的实现中考虑以下流程 -
parentCheckBox
首先定义为 observable
属性(property) self.parentChildData
. self.parentChildData.children
数组用子项初始化。parentCheckBox
现在更改为 computed observable
.我在这里看到的问题是 parentCheckBox
之前被要求对 self.parentChildData.children
中对 child 所做的更改使用react,这个子数组已经初始化,因此没有创建依赖关系,这就是为什么你没有得到你期望的行为。
所以,我稍微改变了你的代码流程并初始化了 self.parentChildData.children
在parentCheckBox
之后被分配了 Angular 色 computedObservable
(尽管它不会改变它最初的定义方式)。
self.parentChildData.parentCheckBox = ko.computed({
read: function() {
var anyChildUnChecked = ko.utils.arrayFirst(self.parentChildData.children(), function(childCheckBox) {
return !childCheckBox.isSelected();
});
var result = anyChildUnChecked == null;
return result;
//return false;
},
write: function(value) {
ko.utils.arrayForEach(self.parentChildData.children(), function(childCheckBox) {
childCheckBox.isSelected(value);
});
}
});
self.parentChildData.children(childrenArray); //values are pushed here
此外,这消除了对 self.makeDependent
的需要函数,虽然我也很奇怪这个函数是如何在仍然是self.parentChildData.children
的情况下让它工作的在 computed
之前已经有值了已创建 :-)
已更新 fiddle .
关于javascript - Knockout Computed Observable 不更新 UI,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/41750539/
是否可以使用 boost::compute 复制自定义结构数组?例如 struct A { float a; }; struct AB { float a; float b; }; BOOST_COM
有谁知道如何在项目上配置的Google Cloud Networks之间移动现有的VM实例?我知道您可以在创建新VM时指定网络,但是似乎没有一种实例化它即可对其进行更改的功能。 任何指针表示赞赏! 保
我正在尝试遵循Google云平台控制台上的教程,以使用Compute Engine创建MongoDB应用程序。我遵循创建虚拟机的教程,但未创建它们,并返回以下错误: 字段“resource.netwo
我想知道是否可以将一个实例的类型更改为另一个实例,例如: n1-standard-1至n1-standard-2 我在文档中没有看到任何内容,但可能是我错过了一些东西。 如果这是不可能的,我该如何处理
我正在尝试让我的GCE实例监听多个IP地址(出于SEO的原因-在同一实例上托管多个低流量站点)。 最终目标:mydomain.com指向IP1,myotherdomain.es指向IP2,GCE实例将
使用scp,我可以添加-r标志以通过ssh将目录下载到本地计算机。 使用时: gcloud compute scp -r 它说“ -r”不是可用选项。 没有-r,我会收到一条错误消息,说我的源路径是一
仅某些IP地址的http负载均衡器存在严重问题。 我在这里还看到了其他一些帖子。我们确保防火墙正常,甚至删除并重新创建了转发规则。自IP更改以来,这非常令人讨厌。 仍然没有喜悦。问题仅影响某些IP地址
我正在尝试删除/删除不再使用的静态IP地址,并且看不到执行此操作的方法。我可以从文档中得到的最接近的是this page,它说: When an instance is stopped, you ca
我每天从台式计算机运行一个简单的任务 3 次。它在下午 4 点、晚上 8 点和凌晨 1 点连接到某个网站,下载少量数据(小于 50mb),并将其存储在硬盘上。每天运行这一点很重要,所以我正在考虑将其转
我是一个关于在Google Compute Engine上联网的问题。 是否可以在您的帐户上设置默认的“源代码/ IP范围”,以便在创建新规则时自动设置此值? 例如,如果我创建此规则: gcloud
我正在尝试使用 POST gcloud CLI 创建一个“带有容器”的 GCE 实例(由 https://www.googleapis.com/compute/v1/projects/{project
我们像这样通过命令行创建实例: gcloud compute instances create instance-name [--stuff otherstuff] --metadata-from-f
在我的本地 macOS 上,以下命令运行良好: $ gcloud source repos clone myrepo --project=myproject (虽然我不确定它是否有效,因为之前我遵循了
在 AWS SDK , EC2实例可以通过 AmazonEC2Client 以编程方式启动.是否GCP一般或Compute Engine特别just offer the CLI-based gclou
我想使用 SparkleShare 在计算机之间同步文件,所以我正在寻找一种方法让 git 存储库在线保存文件。 我正在考虑使用 Google Compute Engine 来托管它们。如果我只为我实
关闭。这个问题不满足Stack Overflow guidelines .它目前不接受答案。 想改善这个问题吗?更新问题,使其成为 on-topic对于堆栈溢出。 4年前关闭。 Improve thi
几周前,我在随意玩弄 Google Cloud Console,并创建了一个 Compute Engine VM。这个过程就像“创建一个虚拟机,命名它,保存”一样简单,就是这样。我现在不需要 Comp
我正在关注 this instruction在 GCE 上设置多个实例或服务器集群。它运行良好,但我不知道如何更新应用程序代码。例如,我有一些错误修复,需要更新代码并重新加载所有实例。无论如何我可以做
我在两个 VM 实例上有一个 node.js 应用程序,我试图通过网络负载平衡来进行负载平衡。为了测试我的服务器是否已启动并提供服务,我在我的应用程序内部监听端口上收到了运行状况检查请求“/healt
如何在GCE中永久设置实例的主机名?我可以通过主机名进行设置,但是重启后它又消失了。 我试图输入元数据(主机名:f.q.d.n),但这没有完成。但是它应该通过元数据(https://github.co
我是一名优秀的程序员,十分优秀!