2012-10-15 66 views
8

Với Bộ sưu tập Backbone nàyXương sống: Cách xác thực xem Mô hình đã tồn tại trong Bộ sưu tập chưa?

define [ 
    'underscore', 
    'backbone', 
    'cs!models/floor' 
], (_, Backbone, Floor) -> 
return Backbone.Collection.extend 
    model: Floor 
    url: -> 
    return '/api/hotels/' + @hotelId + '/floors' 
    initialize: (models, options) -> 
    if (options.hotelId) 
     @hotelId = options.hotelId 
     @.fetch() 

    parse: (response) -> 
    response.floors 

    alreadyExist: -> 
    @.filter((floor) -> 
     return floor.get('number') == @.attrs.get('number') 
    ) 

và thêm một mô hình mới từ một cái nhìn cách dưới đây, làm thế nào tôi có thể xác nhận nếu mô hình đã tồn tại trong bộ sưu tập?

add_floor: (e) -> 
    console.log ' Saving Floor ' 
    e.preventDefault() 
    floorNumber = $('input[name=floorNumber]').val() 
    floorDescription = $('input[name=floorDescription]').val() 
    return new NoticeView({ message: "Please enter a Floor Number.", displayLength: 10000 }) unless floorNumber 
    if ! @collection.add({ number: floorNumber}).alreadyExist() 
    @collection.create({ number: floorNumber, description: floorDescription }, { 
     error: (model, response) -> 
     # $(e.target).removeClass('waiting'); 
     new ErrorView({ message: "Problem saving Floor " + response.responseText, displayLength: 10000 }) 
     success : (model, response) -> 
     console.log model 
     console.log response 
     new NoticeView({ message: "Floor successfully saved.", displayLength: 10000 }) 
    }) 
    else 
    new ErrorView({ message: "Floor already exist." + response.responseText,  displayLength: 10000 }) 
+0

Bộ sưu tập không cho phép bạn làm điều đó :) nó ném một lỗi (Trong mọi trường hợp chỉ có một biến thể nhỏ trong các mô hình của bạn và bạn muốn xác thực nó, liên kết với sự kiện 'add' và xác nhận lại ở đó) – Deeptechtons

+0

Tôi không thể nhận ra cách xác thực nó theo cách bạn nói. Tôi sẽ làm điều đó phía máy chủ. Cảm ơn Deeptechtons. – Aldo

+0

tôi sẽ quay trở lại với một ví dụ :) để nó sẽ giải quyết vấn đề – Deeptechtons

Trả lời

18

Bộ sưu tập xương sống proxy hữu ích trong những trường hợp này.

Nếu bạn có một thể hiện mô hình hiện có, để kiểm tra xem nó tồn tại trong bộ sưu tập bạn chỉ có thể làm điều gì đó như:

var myModel = new Floor(); 

// the following line logs true if model is in collection, false if not. 
console.log(myCollection.contains(myModel)); 

Nếu bạn không có một thể hiện của mô hình, mà từ ví dụ của bạn gợi ý có thể là trường hợp, bạn có thể sử dụng find hoặc findWhere nhấn mạnh chức năng, ví dụ:

var floorNumber = $('input[name=floorNumber]').val() 
var myModel = myCollection.findWhere({ floorNumber: floorNumber }); 

Nếu find hoặc findWhere trả về một mô hình, mà bạn có thể dễ dàng c heck sử dụng một so sánh typeof sau đó bạn sẽ biết liệu các mô hình tồn tại trong bộ sưu tập hay không.

+0

Hi chúng ta có thể sử dụng findwhere nếu chúng ta kiểm tra cid – Pascal

+0

@Pascal: Bạn không thể sử dụng hàm 'findWhere' được hỗ trợ bởi Backbone để tìm kiếm 'cid' của mô hình là thuộc tính' cid' không phải là thuộc tính mô hình. Để thực hiện điều này, bạn sẽ cần sử dụng hàm Underscore 'find' gốc như thế này' var myModel = _.find (myCollection.models, function (model) {return model.cid == "c15";}); ' – dcarson

+0

Cảm ơn điều đó đã giúp – Pascal

0

findWhere trên bộ sưu tập sẽ không dẫn đến lỗi JavaScript nhưng cũng sẽ không tìm thấy mẫu. Một cách thích hợp để kiểm tra xem một bộ sưu tập có chứa một mô hình là sử dụng tìm thấy gạch dưới như thế này:

var model = _.find(collection.models, function (model) { return model.id == 

id_to_be_searched; }); 
var found = collection.contains(model); 

if (found) { 
    // do stuff 
} 
else { 
    // do stuff 
} 
Các vấn đề liên quan