Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/javascript/455.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Javascript 如何在knockoutjs中获得ko.computed或ko.observable底层函数?_Javascript_Knockout.js_Observable - Fatal编程技术网

Javascript 如何在knockoutjs中获得ko.computed或ko.observable底层函数?

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

我正在viewModel上创建
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
但如果我调用底层javascript
ko.observable(PageObj.bcInstoreVisite()[0]),则返回
,但如果我调用底层javascript
ko.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”
from
PageObj.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
    。您只需初始化一次。@IsmailBadawi
    PageObj.bcInStoreActivityWithVisits.IsValidationVisible=ko.computed(函数(){return PageObj.bcInStoreVisit()[0]。Fields.ErrorState()=“Active”| | getErrorState(PageObj.bcInstoreVisition()[0]。Fields.Id()=“Active”});
    导致与访问相同的行为
    PageObj.bcInstoreActivityWithVisitions.IsValidationVisible
    为false
    getErrorState(PageObj.bcInstoreVisition()[0]。Fields.Id())=“Active"
    是正确的。我如何检查
    IsValidationVisible
    订阅了什么函数?我发现您的问题有点难以理解-您是否看过knockout.validation.js?它可能会简化您的问题somewhat@Ian嗨,不,这不是与
    knockout.validation.js
    相关的问题,我也不是在看我如果这是您的建议,ng将重写验证系统。请理解它没有使用knockout.validation.js,但这可以处理所有问题