Javascript 如何在knockoutjs中获得ko.computed或ko.observable底层函数?
我正在viewModel上创建Javascript 如何在knockoutjs中获得ko.computed或ko.observable底层函数?,javascript,knockout.js,observable,Javascript,Knockout.js,Observable,我正在viewModel上创建ko.observable,用于控制验证摘要的可见性 PageObj.bcinstoreictivitywithvisions.IsValidationVisible=ko.obable(PageObj.bcinstoreisit()[0]。Fields.ErrorState()==“Active”| | getErrorState(PageObj.bcinstoreisit()[0]。Fields.Id())==“Active”) 有一个按钮finishaudit
ko.observable
,用于控制验证摘要的可见性
PageObj.bcinstoreictivitywithvisions.IsValidationVisible=ko.obable(PageObj.bcinstoreisit()[0]。Fields.ErrorState()==“Active”| | getErrorState(PageObj.bcinstoreisit()[0]。Fields.Id())==“Active”)代码>
有一个按钮finishaudit
,用于将基础存储中的值设置为活动的bcinstoreist
我已经测试了设置机制,它工作正常
错误状态变量PageObj.bcinstoreisit()[0]。在后续访问页面时,Fields.ErrorState()
也可以正常工作
现在奇怪的部分是:如果我从chrome控制台调用PageObj.bcInstoreActivityWithVisitions.IsValidationVisible
它返回false
但如果我调用底层javascriptko.observable(PageObj.bcInstoreVisite()[0]),则返回
,但如果我调用底层javascriptko.observable(PageObj.bcInstoreVisite()[0]。Fields| | getErrorState(PageObj.bcinstoreisit()[0]。Fields.Id())==“Active”
它返回true
getErrorState(PageObj.bcinstoreisit()[0]。Fields.Id()
已放入其中,以便立即显示验证(下面的屏幕截图)
这意味着PageObj.bcinstoreactivitywithvisions.IsValidationVisible
订阅了其他内容
是否有办法检查ko.observatable
下的底层javascript也被订阅了?换句话说,如何从
PageObj.bcinstoreisit()[0]中获取可观察的ko.obj.bcinstoreisit()[0]。Fields.ErrorState()=“Active”| | getErrorState(PageObj.bcinstoreisit()[0]。Fields.Id())=“Active”
fromPageObj.bcinstoreictivitywithvisions.IsValidationVisible
更新:我已经查看了PageObj.bcinstoreictivitywithvisions.IsValidationVisible.\u订阅者change
事件有3个订阅者,它们看起来都相同,没有一个看起来像(PageObj.bcinstoreisit()[0]。Fields.ErrorState()=“Active”| getErrorState(PageObj.bcinstoreisit()[0]。Fields.Id())==“活动”
更新2:事件触发顺序
if (hasAllDatasources) {
if (isPopulatingForFirstTime) {
$(bc).OnTheMoveBCTrigger('OnPreUIUpdate', [promises]);
$.when.apply($, promises).then(function () {
var eventPromise = $(onTheMove.PageDataRoles).OnTheMoveTrigger('OnPreRender');
eventPromise.then(function () {
onTheMove.applyKOBindings();
invokeMethodsFromQueryString();
$(onTheMove.PageDataRoles).OnTheMoveTrigger('OnRender');
});
});
}
}
这意味着
PageObj.bcInstoreActivityWithVisitions.IsValidationVisible
已订阅
去别的地方
我想你误解了什么是可观察的。IsValidationVisible
没有订阅任何东西。相反,作为可观察的,其他东西可以订阅它
让我们看一个更简单的例子:
// 1. Create foo and give it a value of "Hello"
var foo = ko.observable("Hello");
// 2. Get the value of foo and assign it to bar
var bar = ko.observable(foo());
// 3. Get the value of foo and assign it to baz
var tmp = foo();
var baz = ko.observable(tmp);
请注意#2和#3做的是完全相同的事情。另外,请注意,在所有3个示例中,没有订阅任何其他内容
让我们换个食物,看看会发生什么
foo("Goodbye");
// After that, foo() will return "Goodbye"
// and bar() will return "Hello" - bar was set to "Hello" earlier and hasn't changed
// and baz() will return "Hello" - baz was set to "Hello" earlier and hasn't changed
你想要订阅吗?以下是我们可以订阅的方式:
var bat = ko.computed(function() {
return foo() + " World!";
});
// If you call bat(), you'll see "Hello World!"
// Let's change foo
foo("Adios");
// Now if you call bat(), you'll see "Adios World!"
使用您的代码,您可以设置IsValidationVisible
,通过创建如下所示的计算公式,在其内部的可观察对象出现时自动更新:
PageObj.bcInStoreActivityWithVisits.IsValidationVisible = ko.computed(function() {
return PageObj.bcInStoreVisit()[0].Fields.ErrorState() == "Active" ||
getErrorState(PageObj.bcInStoreVisit()[0].Fields.Id()) == "Active";
});
我更仔细地看了一下你截图中的代码,我想我看到了另一个问题。我将精简代码,使其更加简洁
$(inStoreActivity).on('OnPreUIUpdate', function() {
PageObj.IsAllRequiredActivitiesDone = ko.computed(function() { ... });
PageObj.IsAllOptionalActivitiesDone = ko.computed(function() { ... });
PageObj.IsValidationVisible = ko.observable(...big calculation...)
});
以下是我看到的:
在其他地方,您最初在PageObj对象上创建了3个变量作为计算/观察变量(IsAllRequiredActivitiesDone、IsAllOptionalActivitiesDone、IsValidationVisible
)
在其他地方调用ko.applyBindings(…)
将DOM绑定到PageObj(以及PageObj中的所有内容)
当OnPreUIUpdate事件触发时,您正试图更新这三件事,如上面的代码所示
(如果我对第1点和第2点的假设有误,请提供代码,说明我遗漏了什么)
首先,让我们看看IsValidationVisible
observable
您成功地创建了observable,为其赋值,并将其绑定到DOM。但是,您没有以正确的方式更新observable。因为您正在调用ko.observable(…)
在此事件处理程序中,每次触发事件时都会创建一个新的可观察对象。但是,这些新的可观察对象都没有绑定到DOM(在调用ko.applyBindings时它们不存在)
以下是如何在事件处理程序中正确更新IsValidationVisible
:
// This is good - this is how to update an observable
PageObj.IsValidationVisible(...big calculation...);
// This is bad - DON'T UPDATE AN OBSERVABLE THIS WAY
PageObj.IsValidationVisible = ko.observable(...big calculation...)
第二,让我们考虑计算属性。
computed的思想是,只要计算出的更新使用了可观测值,它就会自动运行。因此,只要定义一次computed,就完成了
您在代码中所做的是在每次事件触发时创建一个新的计算,并且,与我刚才提到的关于可观察对象的内容类似,只有您创建的初始计算将绑定到DOM,因此您创建的新计算不会做任何事。我想您应该使用ko.computed
,而不是ko.observable
。您只需初始化一次。@IsmailBadawiPageObj.bcInStoreActivityWithVisits.IsValidationVisible=ko.computed(函数(){return PageObj.bcInStoreVisit()[0]。Fields.ErrorState()=“Active”| | getErrorState(PageObj.bcInstoreVisition()[0]。Fields.Id()=“Active”});
导致与访问相同的行为PageObj.bcInstoreActivityWithVisitions.IsValidationVisible
为falsegetErrorState(PageObj.bcInstoreVisition()[0]。Fields.Id())=“Active"
是正确的。我如何检查IsValidationVisible
订阅了什么函数?我发现您的问题有点难以理解-您是否看过knockout.validation.js?它可能会简化您的问题somewhat@Ian嗨,不,这不是与knockout.validation.js
相关的问题,我也不是在看我如果这是您的建议,ng将重写验证系统。请理解它没有使用knockout.validation.js,但这可以处理所有问题