2017-02-02 3 views
0

У меня есть этот код:Breeze не обновляет свой список при использовании MergeStrategy.OverwriteChanges

breeze.EntityQuery.from(endpoint) 
    .withParameters(withParameters) 
    .toType(entity) 
    .using(breeze.MergeStrategy.OverwriteChanges) 
    .noTracking(false) 
    .using(manager) 
    .execute() 
    .then(_extractResponseResult) 
    .catch(_doSomethingElse); 

function _extractResponseResult(response) { 
    console.log(">>. results: ", results); 

    return results; 
} 

и результат выглядит примерно так:

Myitem { 
    entityAspect : {...}, 
    name : 'item name', 
    lists : Array[1] 
} 

Всякий раз, когда я выполнить метод breeze.EntityQuery.from(), он всегда возвращает список без обновления. Который действительно начинает меня гадать. Как я могу убедиться, что он обновлен? Например, когда бэкэнд очищает список, не должно быть никаких списков, но когда я делаю breeze.EntityQuery.from(), список все еще существует, хотя глупая сетевая консоль говорит: «Ох, список пуст», поэтому списки на ветру должны быть быть пустым, но потом я смотрю, и он не пуст. Все остальные свойства обновляются, кроме как из списка.

Мои метаданные выглядит следующим образом:

addType({ 
name: 'MyEntity', 
dataProperties: { 
    id: {nullOk: false, isPartOfKey: true}, 
    name: {} 
}, 
navigationProperties: { 
    lists: { 
     hasMany: true, 
     entityTypeName: 'MyList', 
     associationName: 'Foo_MyList' 
    } 
} 
}); 

Я попытался очистить кэш, как предложил here, но, к сожалению, мои списки фактически отображаются в другой части экрана на одной странице (пользователь просто делает перечислить часть MyItem с помощью флажков), а также делать отрывную вещь, удаляет эти списки на экране, а потому, что они все тот же объект, тот же идентификатор, который я не намерен делать.

+0

Работа на стороне сервера удаляются в основном кэш-когерентность, и это [трудная проблема] (http://stackoverflow.com/a/22192116/2517406). –

ответ

0

Обработка удалений на стороне сервера в основном связана с проблемой кеширования и является hard problem.

В этом случае вы можете использовать свойство retrievedEntities возвращаемого объекта данных для информирования клиента о том, какие элементы в списке были возвращены.

В приведенном ниже примере я предположил, что запрос возвращает объект MyItem со всеми его объектами MyList, включенными (расширенными) в ответ сервера. Список retrievedEntities будет содержать все объекты MyList, поэтому, если его не хватает, мы предполагаем, что он был удален на сервере.

manager.executeQuery(query).then(function (data) { 
    var myItem = data.results[0]; 
    var retrieved = data.retrievedEntities; 
    myItem.lists.forEach(function (myList) { 
     if (retrieved.indexOf(myList) < 0) { 
      // already deleted on the server 
      myList.entityAspect.setDetached(); 
     } 
    }) 
    return myItem; 
}); 
Смежные вопросы