首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >如何向嵌套的敲除可观测数组的子数组中添加

如何向嵌套的敲除可观测数组的子数组中添加
EN

Stack Overflow用户
提问于 2013-09-11 08:21:10
回答 1查看 671关注 0票数 0

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

代码语言:javascript
复制
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])]);
    }

我尝试添加到我的可观察到的过程中,而不是执行转换过程,我得到了以下错误:

代码语言:javascript
复制
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'

--这是导致错误的代码

代码语言:javascript
复制
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)]);
                }
            }
        }

看看我的截图是什么机构的样子:

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

EN

回答 1

Stack Overflow用户

发布于 2013-09-11 15:09:03

如果我没有弄错,当您引用剔除-{version}.debug.js文件时,.debug.js是一个属性。如果您使用的是剔除-{version}.js,则不会出现这种情况。无论如何,myObservable._latestValue === myObservable() === ko.unwrap(myObservable)。您不想引用_latestValue,因为当您在生产中使用精简的敲除js文件时,这段代码会中断。您应该重写代码,以便:

代码语言:javascript
复制
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比较不是一个比较,它是一个任务。使用===if (agency().offices()[i].officeID === objContact.OfficeID)

这可能会做到这一点,但我对此表示怀疑,因为我怀疑agency().offices()[i].officID也是可观察的,在这种情况下,您需要使用()来访问它的底层值。

另一个问题是,您要将数组解压缩为数组,就像这样:

代码语言:javascript
复制
var arr = ["A", "B"];
arr.unshift(["Z"]);
// Result: [["Z"], "A", "B"];

因此,除非您打算向数组中添加一个数组,否则将失去.unshift函数中的括号。有些人喜欢溜达。

虽然您可以调用offices().unshift(value);并操作底层数组,但是最好像这样直接调用observableArray上的unshift:offices.unshift(value);,因为KO会通知订阅者并更新DOM。否则,您必须通知KO,该值已发生突变。请参阅此小提琴中的差异。

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

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/18736096

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档