2012-12-05 5 views
1

컬렉션의 모든 값을 필터링 할 수있는 검색/필터 필드가 있습니다. 다음과 같이 내가 가진 데이터는 다음과 같습니다컬렉션의 모든 값에 대한 Backbone.js 필터

exports.administrators = [ 
{ 
    id: 1, 
    firstName: "User1", 
    lastName: "Tester", 
    phone: "781-000-0000", 
    email: "[email protected]", 
    privileges: "view-only" 
}, { 
    id: 2, 
    firstName: "Mickey", 
    lastName: "Mouse", 
    phone: "781-123-4567", 
    email: "[email protected]", 
    privileges: "all" 
}, { 
    id: 3, 
    firstName: "Snow", 
    lastName: "White", 
    phone: "781-890-1234", 
    email: "[email protected]", 
    privileges: "all" 
}, { 
    id: 4, 
    firstName: "Anakin", 
    lastName: "Skywalker", 
    phone: "888-874-9084", 
    email: "[email protected]", 
    privileges: "view-only" 
}, { 
    id: 5, 
    firstName: "Obi-one", 
    lastName: "Kenobi", 
    phone: "908-765-5432", 
    email: "[email protected]", 
    privileges: "all" 
}, { 
    id: 6, 
    firstName: "Master", 
    lastName: "Yoda", 
    phone: "876-654-2134", 
    email: "[email protected]", 
    privileges: "view-only" 
}, { 
    id: 7, 
    firstName: "Han", 
    lastName: "Solo", 
    phone: "781-456-3209", 
    email: "[email protected]", 
    privileges: "all" 
}, { 
    id: 8, 
    firstName: "Neo", 
    lastName: "TheOne", 
    phone: "781-000-0000", 
    email: "[email protected]", 
    privileges: "all" 
}]; 

보기 것이다 KeyUp 이벤트에 따라 이벤트 발생 :

:

AdministratorView.prototype.events = { 
    'click .sub-content th.sort, .sub-content th.sort-up, .sub-content th.sort-down': 'sortTable', 
    'click .light-btn': 'showAdd', 
    'keyup #filter-find': 'filterAdministrators' 
}; 

나는 또한 내가 필터링을 수행 할 기능을 추상화 한을

App.Utils.filterCollection = function(collection, filterValue) { 
if (filterValue !== "") { 
    return _.filter(collection.models, function(data) { 
    var values; 
    values = _.values(data.attributes); 
    _.each(values, function(value) { 
     if (!isNaN(value)) { 
     value = value.toString(); 
     } 
     return value.indexOf(filterValue) > 0; 
    }); 
    }); 
} 

}};

내가 가진 문제는 다음과 같습니다

  1. filterCollection 기능은
  2. 이 일을 더 우아한 방법이 있나요 정의되지 반환?

미리 도움 주셔서 감사합니다.

건배,

Kianosh

업데이트 기능 :

나는 @dbaseman

App.Utils.filterCollection = function(collection, filterValue) { 
var filteredCollection; 
if (filterValue === "") { 
    []; 
} 
return filteredCollection = collection.filter(function(data) { 
    return _.some(_.values(data.toJSON()), function(value) { 
    value = !isNaN(value) ? value.toString() : value; 
    return value.indexOf(filterValue) >= 0; 
    }); 
}); 

}에서 일부 입력 기능을 업데이트 한;

그러나 아직 함수에서 비어있는 (또는 정의되지 않은) 값을 얻고 있습니다. 나는 쾅쾅 거리다 !!

업데이트 # 2 부분적인 해결책을 찾았습니다. 다음은 jsFiddle입니다 - http://jsfiddle.net/kianoshp/YWSSp/. 그것은 올바르게 필터링하지만 필터 필드를 비워두면 원래 데이터 세트가 표시 될 것으로 예상됩니다. 그러나 지금 나는 빈 표를 얻는다. 솔루션에서 작업하지만 도움/힌트가 도움이 될 것입니다.

업데이트 # 3 최종 솔루션은 jsFiddle에 여기 ->http://jsfiddle.net/kianoshp/YWSSp/77/ 감사

+0

이 세 가지 코드는 연결되지 않았으며 연결 방법은 설명하지 않았습니다. 표시된 데이터로 컬렉션을 만드십니까? 어떤 컬렉션? 'events' 속성은 컬렉션을 렌더링하는 뷰와 관련이 있습니까? 'App.Utils'는 무엇이 있을까요? 이 코드가 어떻게 묶인 지에 대한 자세한 내용을 알려 주시면 제대로 작동하지 않는 것을 더 잘 이해할 수 있습니다. –

+0

'App.Utils.filterCollection'은 무엇을해야합니까? 어쩌면 예상되는 출력의 예를 추가 할 수 있습니다. – rdiazv

+0

@gryzzly 모든 코드로 화면을 채우고 싶지 않았습니다. 데이터는 뷰 (AdministratorsView)에서 사용되는 콜렉션에서 반입됩니다. App.Utils.filterCollection은 모든 컬렉션 및 필터 값을 전달하고 지정된 컬렉션의 모든 값과 일치하는 필터링 된 컬렉션을 반환 할 수있는 전역 함수입니다. 나는 그것이 의미가 있기를 바랍니다. – Kianosh

답변

2

저는 McGarnagle이 제공 한 대답을 취하여 개선 사항을 추가했습니다. 아래 코드는 객체로 구성된 속성을 가진 모델 내부를 검색 할 수있게 해줍니다.

Backbone.Collection.prototype.filterValues = function(filterValue) { 
if (filterValue === ""){ 
    return this.models; 
} 

function collectionFilter(data) { 
    if(data.toJSON){ 
     data = data.toJSON(); 
    } 

    return _.some(_.values(data), function(value) { 
     if(_.isObject(value)){ 
      return collectionFilter(value); 
     } 

     if (_.isNumber(value)){ 
      value = value.toString(); 
     } 

     if (_.isString(value)){ 
      value = value.toLowerCase(); 

      return value.indexOf(filterValue) !== -1; 
     } 

     return false; 
    }); 
} 

return this.filter(collectionFilter); 
}; 
2

내가 더 우아한 방법은 사소한 개선 사항을 제외하고, 거기에 생각하지 않습니다 @dbaseman하기 :

  1. 백본 Underscore.JS 방법에 컬렉션은 프록시, 당신은 또한 값이
일치하는지 확인하기 위해 _.some를 사용 collection.filter
  • Yould을 사용할 수 있도록 0

    는 지금까지 문제로, 지금까지 내가 말할 수 있기 때문에 두 가지가 있습니다 :

    1. 당신은 (즉, filter 수익률은 백본 컬렉션이라고 할 때 무엇을) 백본 모델에 _.values를 호출하고 있습니다. model.toJSON()을 사용하여 JSON 표현에서 필터를 호출해야합니다.
    2. 값이 인 숫자인지 확인한 다음 값에 indexOf을 호출합니다.나는 그것이 문자열 (`typeof value == 'string')인지 확인하려고 생각했다.

    다음은 수정 된 기능입니다 (Demo).

    Backbone.Collection.prototype.filterValues = function(filterValue) { 
        if (filterValue == "") return []; 
        return this.filter(function(data) { 
         return _.some(_.values(data.toJSON()), function(value) { 
          if (_.isNumber(value)) value = value.toString(); 
          if (_.isString(value)) return value.indexOf(filterValue) != -1; 
          return false; 
         }); 
        }); 
    } 
    
  • +0

    답해 주셔서 감사합니다. 하나의 작은 문제는 어떤 값이 사실이라면 iterator가 traversing을 멈추기를 원하지 않기 때문에'_.some'이 작동하는지 확신 할 수 없습니다. 나는'_.contains'가 더 잘 작동 할 것이라고 생각합니다. 검사와 관련하여 값이 숫자 인 경우, 그 값을 숫자로 나타내면됩니다. 문자열로 변환 한 다음 평가할 것입니다. 건배. – Kianosh

    +0

    @Kianosh 아 맞습니다. 숫자를 문자열로 변환하는 부분을 놓쳤습니다. 왜 횡단을 멈추고 싶니? 속성치가 일치하면 (자), 그 모델은 항상 필터 반복자에 * true *를 돌려 주어야합니다 ... 맞습니까? – McGarnagle

    +0

    당신 말이 맞습니다; 나는'_.some'을 사용하고 싶습니다. 위의 함수를 업데이트했습니다. 나는 그 기능을 점검했고 그것이해야 할 때 실제로 돌아오고있다. 그러나 반환 값은 항상 비어 있거나 정의되지 않습니다. 어떤 아이디어? – Kianosh

    관련 문제