2013-05-29 35 views
3

我有ViewModel及其屬性之一是一個observableArray(接收器)。我想在添加新記錄之前檢查收集的電子郵件地址是否已存在,以確保不會發生重複的條目。請幫忙。我嘗試了從這裏的方法How to conditionally push an item in an observable array?,但它不工作。它無法檢測到列表中是否已添加電子郵件。我希望如果AddReceiver函數被調用,我將驗證newReceiverData電子郵件地址。這是我的代碼。Knockout.js發現電子郵件地址,如果已經存在observablearray

視圖模型

var ReceiversViewModel = function() { 
    var self = this; 
    var errorModal = {}; 

    self.firstname = ko.observable(); 
    self.lastname = ko.observable(); 
    self.receivers = ko.observableArray(); 
    self.newReceiver = { 
     receiverfirstname: ko.observable(''), 
     receiverlastname: ko.observable(''), 
     receiveremailaddress: ko.observable('') 
    }; 
     self.AddReceiver = function() { 
     var newReceiverData = ko.toJS(self.newReceiver); 
     if (ReceiverValidate() == true) { 
     //check if newReceiverData.receiveremailaddress value already exist 
      self.receivers.push({ 
       EmailAddress: newReceiverData.receiveremailaddress, 
       FirstName: newReceiverData.receiverfirstname, 
       LastName: newReceiverData.receiverlastname 
      }); 
     } 
    }; 
}; 

回答

3

我通常會使用當我使用敲除工具時,輕量級underscore.js庫中的「any」函數。

if (!_.any(self.receivers(), function(receiver) { return receiver.receiveremailaddress() == newReceiver.receiveremailaddress(); })) { 
      // push new receiever 
     } 

您可以根據需要將比較功能設置爲簡單或複雜。

+0

我收到錯誤「JavaScript運行時錯誤:無法獲取未定義或空引用的屬性'receiveremailaddress' 「我認爲,因爲接收器是未定義的,但self.receivers()中有項目 –

+0

您的self.receivers()中的所有接收器observableArray是否具有此屬性? 「any」函數遍歷它們並查看這個屬性(我寫的當前比較函數期望這個屬性在那裏) –

1

你可以改變你self.AddReceiver功能是這樣的:

self.AddReceiver = function() { 
    var newReceiverData = ko.toJS(self.newReceiver); 
    if (ReceiverValidate() == true) { 

     //get just the email addresses from your receiver collection: 
     var emailAddressInReceivers = ko.utils.arrayMap(self.receivers, function (item) { 
       item.EmailAddress; 
      }); 

     //only push into array if email address isn't in emailAddressInReceivers 
     if (emailAddressInReceivers.indexOf(newReceiverData.receiveremailaddress < 0) { 
       self.receivers.push({ 
         EmailAddress: newReceiverData.receiveremailaddress, 
         FirstName: newReceiverData.receiverfirstname, 
         LastName: newReceiverData.receiverlastname 
        }); 
      } 
     } 
    }; 
}; 

這基本上拉平你的接收器列表只返回EMAILADDRESS,則只會增加如果您推送的電子郵件地址不在該列表中,則爲陣列的新接收器

+0

感謝您的幫助哥們,但我得到了問題。即使新項目已推送到self.receivers,emailAddressInReceivers也會返回[]。由於emailAddressInReceivers是[]具有重複電子郵件的新項目仍在添加到集合中。 –

+0

是的,它是一個當前位於self.receivers中的字符串(電子郵件地址)數組。下一行基本上說,如果emailAddressInReceivers不包含newReceiverData.receiveremailaddress然後添加它 – Alex

+1

請注意indexOf()不支持在IE8或更低。 (請參閱http://stackoverflow.com/a/3629211/1016885) –

相關問題