我正在viewModel上创建ko.observable
,用于控制验证摘要的可见性。PageObj.bcInStoreActivityWithVisits.IsValidationVisible = ko.observable(PageObj.bcInStoreVisit()[0].Fields.ErrorState() == "Active" || getErrorState(PageObj.bcInStoreVisit()[0].Fields.Id()) == "Active");
我已经测试了设置机制,有一个按钮finish audit
将该底层存储器中的值设置为活动的,并且工作正常。
后续访问页面时,错误状态变量bcInStoreVisit
也可以正常工作。
现在很奇怪的部分:在刷新页面之前激活了验证值之后,如果我从chrome控制台PageObj.bcInStoreVisit()[0].Fields.ErrorState()
调用它会返回PageObj.bcInStoreActivityWithVisits.IsValidationVisible
,但是如果我调用基础javascript false
则会返回ko.observable(PageObj.bcInStoreVisit()[0].Fields.ErrorState() == "Active" || getErrorState(PageObj.bcInStoreVisit()[0].Fields.Id()) == "Active"
。 true
已放置在此处,以便立即显示验证(下面的屏幕截图)。
这意味着getErrorState(PageObj.bcInStoreVisit()[0].Fields.Id())
已订阅其他内容。
是否有办法检查PageObj.bcInStoreActivityWithVisits.IsValidationVisible
下的哪些基础javascript也已订阅?
换句话说,如何从ko.observable
获取ko.observable(PageObj.bcInStoreVisit()[0].Fields.ErrorState() == "Active" || getErrorState(PageObj.bcInStoreVisit()[0].Fields.Id()) == "Active"
?
更新:我查看了PageObj.bcInStoreActivityWithVisits.IsValidationVisible
事件,其中有3个对于PageObj.bcInStoreActivityWithVisits.IsValidationVisible._subscribers
事件,它们看起来都相同,而且都不像change
更新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.bcInStoreActivityWithVisits.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所做的完全相同。另外,请注意,在所有这三个示例中,没有任何预订。
让我们更改foo,看看会发生什么
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";
});
关于javascript - 如何在Knockout.js中获取ko.computed或ko.observable基础函数?,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/24682034/