Breeze如何在Where子句中使用客户端属性

时间:2014-05-05 14:42:39

标签: typescript breeze

我只有客户端Metadatstore:

initialize = (metadataStore) => {
    metadataStore.addEntityType({
        shortName: "AppsListHelper",
        namespace: NFL.settings.entityNamespace,
        dataProperties: {
            Path: { dataType: "String" },
            Title: { dataType: "String", isPartOfKey: true },
            Author: { dataType: "String" },
            Description: { dataType: "String" },
            ImageUrl: { dataType: "String" },
            IsFavourite: { dataType: "Boolean" },
            AppTypeName: { dataType: "String", isPartOfKey: true },
            Departments: { dataType: "String" },
            AlwaysShownTo: { dataType: "String" },
            AvailableTo: { dataType: "String" },
            HasAccess: { dataType: "Boolean" },
            Keywords: { dataType: "String" }
        }
    });

    metadataStore.registerEntityTypeCtor('AppsListHelper', function () { this.IsMyApp = ko.observable(false); });
}

我想为客户端使用添加额外的属性'IsMyApp' - 在我的一个GET方法中,我将此属性设置为'true':

    querySucceded = (data) => {   
    ko.utils.arrayForEach(data.results, (item: m_application.Application) => {
        item.IsMyApp(true);
    });
    return this.apps(data.results);
}

现在我尝试使用query:

通过breeze manager查询本地数据
private getLocal = (resource) => {
    var query = this.EntityQuery.from(resource).where('IsMyApp', '==', 'true').toType("AppsListHelper");
    return this.breezeManager.executeQueryLocally(query);
}

但没有任何反应(视图已加载但是为空白),在删除'where子句'之后,它会返回所有数据。

任何帮助将不胜感激:)

我更详细的情况如下:我有2个观看次数:'我的应用'和'所有应用'。由于所有实体都是相同类型的'AppsListHelper',因此在我收到来自服务器的数据的两个列表后,它们被缓存 - 这导致从本地缓存中拉出两个视图(对我来说理解它)时显示相同的数据。因此,作为第一个解决方案,我想在客户端添加额外的标志'IsMyApp',因为我真的不需要它在服务器上并根据该标志的值区分数据以获得适当的视图。

2 个答案:

答案 0 :(得分:0)

您只能为Breeze知道的属性创建查询。在您的情况下,您将属性添加到构造函数中,但Breeze并不真正知道您正在执行此操作,只是允许您使用方法来执行此操作。 (如果这有意义的话)

您可能只是想过滤数组,那么为什么不查询符合其他条件的对象然后只过滤它们呢?这可能不是有效的TypeScript,但应该以正确的方式显示 -

var filteredResults = ko.utils.arrayFilter(data.results, function (result) {
    return result.IsMyApp() === true;
});

答案 1 :(得分:0)

@PKad是正确的,Breeze查询会忽略无法识别的属性。您可以按照他的建议过滤缓存查询结果。

未映射的属性是另一个需要考虑的选项。未映射的属性是Breeze"但未映射到您的数据库,并且不会保留在服务器上。它是仅限客户的扩展程序。

您可以在客户端上定义元数据时定义未映射的属性,也可以在自定义构造函数中定义元数据并使用该类型注册。

然后您可以按照DocCode:entityExtensionTests测试"can query an unmapped property with cache query"中所示查询它。