Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/javascript/445.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-计算可观测数据中的引用局部字段_Javascript_Knockout.js_Computed Observable - Fatal编程技术网

Javascript Knockoutjs-计算可观测数据中的引用局部字段

Javascript Knockoutjs-计算可观测数据中的引用局部字段,javascript,knockout.js,computed-observable,Javascript,Knockout.js,Computed Observable,我是KO的新手,很难得到一个计算值。我有一个由许多对象组成的viewmodel,因为我从数据库中检索数据时,有许多不同的表。这是我如何设置VM的一个示例。请随意批评我在这里做错的任何事情(尽管它与计算值无关): isActiveProduct无法工作,因为它不知道productCode是什么。我试过这样做。productCode,self.productCode,self.mySecondObject()。productCode,它们似乎都不起作用。 是否可以访问该值?我的整个虚拟机设置中是否存

我是KO的新手,很难得到一个计算值。我有一个由许多对象组成的viewmodel,因为我从数据库中检索数据时,有许多不同的表。这是我如何设置VM的一个示例。请随意批评我在这里做错的任何事情(尽管它与计算值无关):

isActiveProduct无法工作,因为它不知道productCode是什么。我试过这样做。productCode,self.productCode,self.mySecondObject()。productCode,它们似乎都不起作用。 是否可以访问该值?我的整个虚拟机设置中是否存在导致此失败的错误

谢谢

史蒂夫

更新: 我现在不会让对象可见,也不会这样声明我的VM:

var viewModel = function(object1, object2...) {
    var self = this;
    var activeProductCodes = ['AB-1', 'AB-2', 'AB-3'];

    self.myFirstObject = {
        field1: ko.observable(object1.field1),
        field2: ko.observable(object1.field2),
        field3: ko.observable(object1.field3)
    }

    self.mySecondObject = {
        productCode: ko.observable(object2.productCode),

        isActiveProduct: ko.computed(function() {
            return self.activeProductCodes.indexOf(productCode) !== -1 ? true : false;
        }, self)
    }
}

撇开评论中的简短讨论不谈,当我在knockout中处理子viewmodels时,我倾向于正确定义它们,而不是使用匿名对象。所以在你的情况下,可能是这样的

var viewModel = function(object1, object2...) {
    var self = this;
    var activeProductCodes = ['AB-1', 'AB-2', 'AB-3'];

    self.myFirstObject = ko.observable(new myFirstViewModel(object1)); // omitted for brevity

    self.mySecondObject = ko.observable(new mySecondViewModel(object2, activeProductCodes ));
}

var mySecondViewModel = function(object2, activeProductCodes){
    var self = this;

    self.productCode = ko.observable(object2.productCode);
    self.isActiveProduct = ko.computed(function() {
            return activeProductCodes.indexOf(self.productCode()) !== -1 ? true : false;
    }, self)
}
我还提到,有一个很好的机会,您不需要子视图模型来实际观察到,因此您可能不需要这样做:

self.mySecondObject = new mySeocndViewModel(object2, activeProductCodes );

这取决于您的用例。

为什么存在
mySecondObject
?为什么不在
viewModel
本身上同时使用
productCode
isActiveProduct
?另一个问题-您是否希望
m6yFirstObject
mySecondObject
发生任何变化?如果不是,它们应该是POJO的,因为产品属于第二个对象。视图模型中有许多对象,我必须在页面上显示,我有一张帮助台记录单,他们遇到问题的产品,任何工程师访问的详细信息等,这些都存储在数据库中的单独表中,我必须单独查询。实际上,有近10个物体。我在设置虚拟机时发现,如果我没有使对象本身可见,那么页面就不会收到更新,除非您将整个对象更改为另一个对象,否则它不需要可见。如果你只是改变了物体的场,就让这些场可见。当您从服务器加载更新时,更新字段本身而不是整个objectRight,我没有使对象可见,并且在我的问题中添加了更新的代码,这仍然有效。当我以前尝试过这个方法时,页面上的字段没有更新,但我肯定是做了其他错误的事情。然而,我仍然有我原来的问题,计算不正确。如何读取productCode字段?当我打断这行代码时,self不包含mySecondObject,这一定是我不能执行self.productCode的原因,那么我应该做什么呢?PS我将在稍后更改我的sub-VM声明,如您的回答所示。我恐怕您现在已将其直接复制。-我的回答给你一个更好的选择。谢谢,我正在更新代码,我们会回来报告的!我的secondviewmodel中的冒号不应该是等号吗?呜呼,它行得通!非常感谢你的帮助和快速反应,你是个救命恩人!我当然不会称自己为Javascript专家,尽管我已经用了很多次。“自我”的概念对我来说是新的,这是我第一次使用击倒,所以你帮了我很大的忙@迷你2003呜呜!很高兴我能帮忙。我非常了解KO,并且多次面对这个问题,所以我知道如何解决它。
self.mySecondObject = new mySeocndViewModel(object2, activeProductCodes );