2014-12-02 22 views
0

我有一个Javascript中的“对象”,创建一个扩展的observable,Location等等。Knockout扩展Observable在取消引用时返回undefined?

当我尝试使用值填充项目时,在Internet Explorer 11中,似乎只会出现错误,表示它无法对属性'Address1'进行未定义或空引用。

奇怪的是,当我进入控制台并输入“self”时,它将Location显示为可观察对象。如果我键入“self.Location”,它将显示observable的功能。如果输入“self.Location()”,则表示未定义。几乎所有其他东西似乎都没问题。我包含了两个观察对象的代码。导致问题的一个(位置)。另一个参与者,在代码上看起来很相似,但“被观察到”很好。

self.Participants = ko.observableArray([]).extend({ 
     validation: [{ 
      validator: function (value) { 
       if ((showConfig && showConfig.CreateWorkOrder) || (showConfig && showConfig.WorkOrderNumber) || (showConfig && showConfig.WorkOrderId)) { 

        self.ModelErrors({ sort: 7, element: "participants-container", error: "", clear: true }); 

        return true; 
       } 
       var HasGroupRoute = self.GroupRoute() != "g0"; 
       if (HasGroupRoute) { 
        self.ModelErrors({ sort: 7, element: "participants-container", error: "", clear: true }); 

        return true; 
       } 
       if ((!value || value.length <= 0) || HasGroupRoute) { 
        //$("#participants-container").addClass('sp-error'); 
        //$("#divErrMsgBlock").show(); 
        //addressError.push("<li style='text-align: left; list-style-type: square'>You must select a participant.</li>"); 
        self.ModelErrors({ sort: 7, element: "participants-container", error: "<li style='text-align: left; list-style-type: square'>You must select a participant.</li>" }); 
        return false; 
       } 
       else { 
        //$("#participants-container").removeClass('sp-error'); 
        //$("#divErrMsgBlock").hide(); 
        self.ModelErrors({ sort: 7, element: "participants-container", error: "", clear: true }); 
        return true; 
       } 
      }, 
      message: '', 

     }] 

    }); 
    self.Location = ko.observable().extend({ 
     validation: [{ 
      validator: function (value) { 
       if (value == undefined) return;      
       var Address1 = (value.Address1() == undefined ? null : value.Address1()); 
       var City = (value.City() == undefined ? null : value.City()); 
       var State = (value.StateOrProvince() == undefined ? null : value.StateOrProvince()); 
       var Zip = (value.PostalCode() == undefined ? null : value.PostalCode()); 
       var _mustCheck = (self.AppointmentType() == "4" || self.JobReference() != undefined) || (Address1 != null && Address1 != '') || (Address1 != null && Address1 != '') || (City != null && City != '') || (Zip != null && Zip != ''); 
       var _missing = (Address1 == undefined || Address1 == null) || (City == undefined || City == null) || (State == undefined || State == null) || (Zip == undefined || Zip == null); 

       if (_mustCheck && _missing) { 
        //addressError.push("<li style='text-align: left; list-style-type: square'>Address is not complete.</li>"); 
        self.ModelErrors({ sort: 8, element: "location-container", error: "<li style='text-align: left; list-style-type: square'>Address is not complete.</li>" }); 

        if (value.Address1() == null || value.Address1() == '') { 
         //$("#appt-address1").addClass('sp-error'); 
         self.ModelErrors({ sort: 8, element: "appt-address1", error: "", clear: false }); 
        } 
        else { 
         //$("#appt-address1").removeClass('sp-error'); 
         self.ModelErrors({ sort: 8, element: "appt-address1", error: "", clear: true }); 
        } 

        if (value.City() == null || value.City() == '') { 
         //$("#appt-city").addClass('sp-error'); 
         self.ModelErrors({ sort: 8, element: "appt-city", error: "", clear: false }); 
        } 
        else { 
         //$("#appt-city").removeClass('sp-error'); 
         self.ModelErrors({ sort: 8, element: "appt-city", error: "", clear: true }); 
        } 

        if (value.StateOrProvince() == undefined || value.StateOrProvince() == '') { 
         //$("#cmboStates").addClass('sp-error'); 
         self.ModelErrors({ sort: 8, element: "cmboStates", error: "", clear: false }); 
        } 
        else { 
         //$("#cmboStates").removeClass('sp-error'); 
         self.ModelErrors({ sort: 8, element: "cmboStates", error: "", clear: true }); 
        } 

        if (value.PostalCode() == null || value.PostalCode() == null) { 
         //$("#appt-zip").addClass('sp-error'); 
         self.ModelErrors({ sort: 8, element: "appt-zip", error: "", clear: false }); 
        } 
        else { 
         //$("#appt-zip").removeClass('sp-error'); 
         self.ModelErrors({ sort: 8, element: "appt-zip", error: "", clear: true }); 
        } 
       } else { 
        self.ModelErrors({ sort: 8, element: "location-container", error: "", clear: true }); 
        self.ModelErrors({ sort: 8, element: "appt-address1", error: "", clear: true }); 
        self.ModelErrors({ sort: 8, element: "appt-city", error: "", clear: true }); 
        self.ModelErrors({ sort: 8, element: "cmboStates", error: "", clear: true }); 
        self.ModelErrors({ sort: 8, element: "appt-zip", error: "", clear: true }); 
       } 
      }, 
      message: '' 
     }] 
    }); 

引起IE11错误的行是这样的:

self.Location().Address1(model.Address1); 

回答

0

可观察

self.Participants 

与空数组实例化的,并且具有从一开始的值。

然而,

self.Location 

不供应任何初始值,并且将初始化而不导致未定义的值。这就是说,在什么时候调用

self.Location().Address1(model.Address1); 

之前没有你的代码提供一个值来填充self.location观察到的?

+0

我在代码中看起来更深入,你是对的。我在self.Location()。Address1之前添加了说明if(!self.Location())self.Location(new AddressModel()),其中AddressModel具有所有需要的东西。 – SpaceCowboy74 2014-12-02 21:35:25

+0

不错。祝你好运! – 2014-12-02 21:44:33