我正在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/

10-11 14:10