2016-06-06 1 views
1

Мы пытаемся интегрировать Netflix's Falcor в нашу систему. Как мы можем получить пути на основе фильтра. Например, если мы хотим получить Todos, у которого есть значение done: false.Netflix Falcor: Фильтры в процессе работы модели

JSON Graph Пример:

{ 
    todosById: { 
     "44": { 
      name: "Login to stackoverflow", 
      done: true, 
      prerequisites: [] 
     }, 
     "54": { 
      name: "Ask question on stackoverflow", 
      done: false, 
      prerequisites: [{ $type: "ref", value: ["todosById", 54] }] 
     },    
     "64": { 
      name: "Accept answer", 
      done: false, 
      prerequisites: [] 
     } 
    }, 
    todos: [ 
     { $type: "ref", value: ["todosById", 44] }, 
     { $type: "ref", value: ["todosById", 54] }, 
     { $type: "ref", value: ["todosById", 64] } 
    ] 
} 

Теперь мы хотим получить только Todos, которые не являются done: true еще.

Получение всех todos и фильтрации на стороне клиента кажется излишним. Я предполагаю, что нам, возможно, потребуется использовать операцию call, но я не мог найти никакого примера о том, как реализовать функцию в графике JSON в руководствах. (Также не уверен, что может быть лучший способ)

ответ

1

Подумайте о том, что ваша модель содержит все, что может запросить клиент, а не только как хранимые данные. Это то, что вы хотите:

{ 
    todosByDone: { 
     "true": [ 
      { $type: "ref", value: ["todosById", 44] } 
     ], 
     "false": [ 
      { $type: "ref", value: ["todosById", 54] }, 
      { $type: "ref", value: ["todosById", 64] } 
     ] 
    }, 
    todosById: { 
     "44": { 
      name: "Login to stackoverflow", 
      done: true, 
      prerequisites: [] 
     }, 
     "54": { 
      name: "Ask question on stackoverflow", 
      done: false, 
      prerequisites: [{ $type: "ref", value: ["todosById", 54] }] 
     },    
     "64": { 
      name: "Accept answer", 
      done: false, 
      prerequisites: [] 
     } 
    }, 
    todos: [ 
     { $type: "ref", value: ["todosById", 44] }, 
     { $type: "ref", value: ["todosById", 54] }, 
     { $type: "ref", value: ["todosById", 64] } 
    ] 
} 

И тогда вы можете запросить сделать ToDos, как и любой другой массив: todosByDone.true[0..10]. Конечно, вы можете проектировать свою модель, как хотите, и там много возможностей. Рассмотрим моделирование с точки зрения клиента. Например, было бы неплохо, если бы клиент мог сделать todos.done и todos.todo (иначе не сделано). Тогда ваша модель будет выглядеть примерно так:

{ 
    todos: { 
     done: [ 
      { $type: "ref", value: ["todos", "byId", 44] } 
     ], 
     todo: [ 
      { $type: "ref", value: ["todos", "byId", 54] }, 
      { $type: "ref", value: ["todos", "byId", 64] } 
     ], 
     byId: { 
      "44": { 
       name: "Login to stackoverflow", 
       done: true, 
       prerequisites: [] 
      }, 
      "54": { 
       name: "Ask question on stackoverflow", 
       done: false, 
       prerequisites: [{ $type: "ref", value: ["todos", "byId", 54] }] 
      },    
      "64": { 
       name: "Accept answer", 
       done: false, 
       prerequisites: [] 
      } 
     }, 
     byCreationTime: [ 
      { $type: "ref", value: ["todos", "byId", 44] }, 
      { $type: "ref", value: ["todos", "byId", 54] }, 
      { $type: "ref", value: ["todos", "byId", 64] } 
     ] 
    }, 

} 

Не стесняйтесь исследовать this app для некоторых примеров.

+0

Спасибо за ответ. Ваше решение решит проблему, которую я опубликовал в вопросе, и поэтому я ее принял. Но в случае, если у вас может быть 10 разных статусов, и вы можете показать их комбинацию из всех, где я хочу иметь возможность просматривать любое количество статусов вместе (например, просто «сделано» или «сделано», ожидающий, отложенный "и т. д.), создание модели для сдерживания всех комбинаций кажется слишком большим. – omerts

+0

@omerts [Этот вопрос] (http://stackoverflow.com/questions/37441128/how-to-structure-a-multi-parameter-search-in-falcor) относится к этому случаю. –