いくつかのフィルター プロパティを持つ ViewModel があります。
class IndexModel
TermoBusca: ko.observable()
class ViewModel extends IndexModel
Nome: ko.observable()
Endereco: ko.observable()
Contato: ko.observable()
Responsaveis: ko.observableArray []
ResponsaveisSelected: ko.observableArray []
URL OData を生成する算出プロパティ
@Url = ko.computed
read: ->
console.count "@Url:read called!"
urlBase = "api/empresas?$expand=Teste"
#return "#{urlBase}&#{@TermoBusca()}" if @TermoBusca() and @TermoBusca().indexOf("$filter") == 0
group = []
if @Nome()
group.push "Name eq #{@Nome()}"
if @Endereco()
group.push "substringof('#{@Endereco()}', Endereco)"
if @Contato()
contatos = @Contato().split(/[\s,.]+/)
group.push "(" + ko.utils.arrayMap(contatos, (nome) -> "substringof('#{nome}', Contato/Nome)").join(" or ") + ")"
responsaveisSelected = ko.utils.unwrapObservable @ResponsaveisSelected()
if responsaveisSelected and responsaveisSelected.length > 0
group.push "(" + ko.utils.arrayMap(responsaveisSelected, (id) -> "Responsaveis/Id eq " + id ).join(" or ") + ")"
if group.length > 0
urlFilter = "$filter=#{group.join(' and ')}"
#@TermoBusca urlFilter
return "#{urlBase}?#{urlFilter}"
urlBase
owner: @
deferEvaluation: true
考え方は単純です。ユーザーがフィルターを入力すると、OData URL が自動的に生成されます。
そしてその作品:https://c9.io/ridermansb/knockoutjsobservable/workspace/index.html
新機能
アイデアは、単一のテキスト フィールドを配置することであり、その中にフィルターを作成できます。
例: luciは名前と住所で検索します。次のような特殊文字を使用できます。@mikeは連絡先名を検索します。
このプロパティTermoBusca
は、ユーザーが検索を入力するテキスト フィールドであり、OData URL に変換されます。
しかし、私はそれを機能させることはできません!
完全なコードはhttps://c9.io/ridermansb/knockoutjsobservableにあります。
私はギットを使用しています!
支店長は、プロパティを持っていませんTermoBusca
!ブランチ *termo_busca* には、単一のテキスト フィールドの実装が含まれています。
このビデオを参照してください: http://screenr.com/AMj7