Javascript 如何添加到敲除可观察数组的嵌套子级

Javascript 如何添加到敲除可观察数组的嵌套子级,javascript,knockout.js,ko.observablearray,Javascript,Knockout.js,Ko.observablearray,我有一些代码可以添加到一个淘汰的可观察数组中,我正在将可观察数组转换为一个对象,取消移动一个新对象,然后将该对象映射回视图模型。这是可行的,但似乎很慢。大约需要2-5秒或更长时间 function addContact(office) { // Passing in object array of agency. We no it contains correct office and agency ID // Assign observable data to new var

我有一些代码可以添加到一个淘汰的可观察数组中,我正在将可观察数组转换为一个对象,取消移动一个新对象,然后将该对象映射回视图模型。这是可行的,但似乎很慢。大约需要2-5秒或更长时间

function addContact(office) { // Passing in object array of agency. We no it contains correct office and agency ID

        // Assign observable data to new variable then remove old
        // variable from mapping
        var objAgency = ko.toJS(agency);

        vm.agency.removeAll();


        // Fill new object with empty strings and related data
        var objContact = {
            agencyID: office.agencyID._latestValue,
            emailAddress: "",
            firstName: "",
            jobName: "",
            office: "",
            OfficeID: office.officeID._latestValue,
            personID: "",
            surName: "",
            title: ""
        }



        // unshift where office ID match
        for (i in objAgency[0].offices) {
                if (!isNaN(i)) {
                    if (objAgency[0].offices[i].officeID === objContact.OfficeID) {
                        objAgency[0].offices[i].contacts.unshift(objContact); // At i remove one object
                    }
                else {

                }
            } 
        }
        vm.agency([ko.mapping.fromJS(objAgency[0])]);
    }
我尝试添加到我的observable中,而不是执行转换过程,我得到了以下错误:

Unhandled exception at line 9423, column 13 in http://localhost:13762/scripts/breeze.debug.js

0x800a01b6 - JavaScript runtime error: Object doesn't support property or method 'getProperty'
这是导致错误的代码

for (i in agency._latestValue[0].offices._latestValue) {
            if (!isNaN(i)) {
                if (agency._latestValue[0].offices._latestValue[i].officeID = objContact.OfficeID) {
                    agency._latestValue[0].offices._latestValue[i].contacts._latestValue.unshift([ko.mapping.fromJS(objContact)]);
                }
            }
        }
请参见我的屏幕截图,了解代理的外观:


添加到这个可观察数组的正确方法是什么?据我所知,最新值是一种跟踪更改的机制,所以我不应该篡改它?

如果我没有弄错的话,
\u latestValue
是引用淘汰-{version}.debug.js文件时的一个属性。如果您使用knockout-{version}.js,则不会出现这种情况。在任何情况下,
myObservable.\u最新值===myObservable()==ko.unwrap(myObservable)
。您不想引用
\u latestValue
,因为在生产中使用缩小的敲除js文件时,此代码将中断。您应该将代码重写为:

for (i in agency().offices()) {
    if (!isNaN(i)) {
        if (agency().offices()[i].officeID = objContact.OfficeID) {
            agency().offices()[i].contacts().unshift([ko.mapping.fromJS(objContact)]);
        }
    }
}
这仍然是不正确的,因为你的
如果
比较不是比较,那就是作业。使用
==
if(agency().offices()[i].officeID===objContact.officeID)

这也许可以做到,但我对此表示怀疑,因为我怀疑
agency().offices()[I].officID
也是可观察的,在这种情况下,您需要使用
()
来访问其基本值

另一个问题是将数组反移位为数组,有点像这样:

var arr = ["A", "B"];
arr.unshift(["Z"]);
// Result: [["Z"], "A", "B"];
因此,请丢失.unshift函数中的括号,除非您打算将数组添加到数组中。有些人喜欢溜溜球

尽管您可以调用
offices().unshift(value)并操作底层数组,最好直接在ObservalArray上调用unshift,如下所示:
offices.unshift(value)因为KO随后将通知订阅者并更新DOM。否则,您必须通知KO该值已发生变化。看看这其中的区别

希望这将有助于解决您的问题