首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >对于Durandal和Breeze,breeze.config.MetadataHelper不是构造函数错误。

对于Durandal和Breeze,breeze.config.MetadataHelper不是构造函数错误。
EN

Stack Overflow用户
提问于 2015-01-26 13:40:16
回答 1查看 243关注 0票数 0

我正在使用Durandal v2.1和Breeze v1.5开发SPA。这是我第一次使用这些库。我正在手工为Breeze创建元数据,因此我使用元数据-帮助插件,如Breeze文档中所解释的那样。为此,我依赖于找到这里的示例。当我运行应用程序时,我会得到以下错误:

错误:加载根模块(viewmodel/shell)失败。详细信息: breeze.config.MetadataHelper不是构造函数.

这个错误似乎发生在我用来用这一行代码创建元数据的metadataFactory.js文件中(请参阅文章中的metadataFactory.js文件):

代码语言:javascript
复制
helper = new breeze.config.MetadataHelper(namespace, keyGen);

我看过的所有例子都清楚地表明,上述说明是有效的,所以我无法理解问题的所在。

这是我的main.js

代码语言:javascript
复制
requirejs.config({
    'paths': {
        'durandal': '../durandal',
        'plugins': '../durandal/plugins',
        'transitions': '../durandal/transitions',
        'text': '../durandal/amd/text',

        'jquery': '../../Scripts/jquery-2.1.3.min',
        'jqueryUI': '../../Scripts/jquery-ui-1.11.2.min',
        'knockout': '../../Scripts/knockout-3.2.0',
        'bootstrap': '../../Scripts/bootstrap.min',
        'breeze': '../../Scripts/breeze.min',
        'breezeMetadataHelper': '../../Scripts/breeze.metadata-helper',
        'Q': '../../Scripts/q.min',

        'toastr': '../../Scripts/toastr.min',
        'moment': '../../Scripts/moment',

        'logger': '../services/logger',
        'hubService': '../services/hubService',
        'datacontext': 'dataservices/datacontext',
        'metadataFactory': 'dataservices/metadataFactory',
        'constants': 'models/constants',
        'menu': '../shared/viewmodels/menu',
        'menuItem': '../shared/viewmodels/menuItem'
    },
    'shim': {
        'bootstrap': {
            'deps': ['jquery']
        },
        'select2': {
            deps: ['jquery', 'style!Content/select2-bootstrap'],
            exports: 'select2'
        },
        'breeze': {
            deps: ['knockout', 'jquery', 'Q']
        },
        'breezeMetadataHelper': {
            deps: ['breeze']
        }
    },
    urlArgs: 'bust=' + (new Date()).getTime()
});


define(['durandal/system', 'durandal/app', 'durandal/viewLocator', 'logger'], function (system, app, viewLocator, logger) {

    //>>excludeStart('build', true);
    system.debug(true);
    //>>excludeEnd('build');

    logger.log('Loading main module');

    app.title = 'ERWS';

    app.configurePlugins({
        router: true,
        dialog: true,
        widget: {
            kinds: ['grid'] // durandal-grid widget (https://github.com/tyrsius/durandal-grid)
        }
    });

    app.start().then(function () {
        viewLocator.useConvention();
        app.setRoot('viewmodels/shell', 'entrance');
    });
});

这是我的shell.js文件:

代码语言:javascript
复制
define(function (require) {
    'use strict';

    var logger = require('logger');
    logger.log('Loading shell module');

    var ko = require('knockout');
    var router = require('plugins/router');
    var app = require('durandal/app');
    var constants = require('constants');
    var model = require('models/userInfo');

    var entity = {
        contentBody: ko.observable(''),
        appName: constants.AppName,
        copyrightText: constants.CopyrightText,
        userName: ko.observable(''),
        userImage: ko.observable('')
    };

    var loadData = function () {
        var data = model.entity;

        if (data) {
            entity.userName(data.UserName);
            entity.userImage(data.UserImage);
        } else {
            logger.log('Error loading user info');
        }
    };

    return {
        dashboard: entity,
        activate: function () {
            loadData();
        }
    };
});

这就是我用来创建元数据的metadataFactory.js,基于我找到的这里示例

代码语言:javascript
复制
/* 
 * Creates BreezeJS Metadata
 *
 * Usage:
 *    // assume you include this service as 'metadataFactory'
 *
 *    // create a new EntityManager
 *    var manager = new breeze.EntityManager("your-service-endpoint");
 *
 *    // get the MetadataStore from the manager and fill it
 *    var store = manager.metadataStore;
 *    metadataFactory.fillMetadataStore(store);
 *   
 */
define(function (require) {
    'use strict';

    var logger = require('logger');
    logger.log('Loading metadataFactory module');

    var breeze = require('breeze');

    var addType, date, dt, bool, helper, id, identity;

    function addCommunityInfo() {
        addType({
            name: 'CommunityInfo',
            defaultResourceName: 'CommunityInfos',
            autoGeneratedKeyType: identity,
            dataProperties: {
                id: { type: id },
                groupsTotal: { max: 3, nullOk: false },
                regionsTotal: { max: 3, nullOk: false },
                landExtensionTotal: { max: 7, nullOk: false },
                parcelsTotal: { max: 4, nullOk: false }
            }
        });
    }

    function addDevicesInfo() {
        addType({
            name: 'DevicesInfo',
            defaultResourceName: 'DevicesInfos',
            autoGeneratedKeyType: identity,
            dataProperties: {
                id: { type: id },
                deviceServers: { max: 3, nullOk: false },
                deviceAdBoards: { max: 3, nullOk: false },
                deviceControllers: { max: 3, nullOk: false },
                deviceTotalUnits: { max: 3, nullOk: false }
            }
        });
    }

    function addGroupInfo() {
        addType({
            name: 'GroupInfo',
            defaultResourceName: 'GroupInfos',
            autoGeneratedKeyType: identity,
            dataProperties: {
                id: { type: id },
                groupName: { max: 50, nullOk: false },
                acronym: { max: 5, nullOk: false },
                dateOfAffiliation: { type: date, nullOk: false },
                inworldDescription: { max: 50, nullOk: false },
                webDescription: { max: 50, nullOk: false },
                yourRoleValue: { max: 50, nullOk: false },
                landOwnedSize: { type: id },
                landOwnedValue: { max: 50, nullOk: false },
                numberOfRentals: { max: 50, nullOk: false },
                presentInRegions: { max: 50, nullOk: false },
                numberOfParcels: { max: 50, nullOk: false },
                numberOfDevices: { max: 50, nullOk: false },
                userRole: { max: 50, nullOk: false },
                inWorldKey: { max: 50, nullOk: false },
                created: { type: date, nullOk: false },
                updated: { type: date, nullOk: true }
            },

            navigationProperties: {
                regions: { type: 'Region', hasMany: true },
                devices: { type: 'Device', hasMany: true },
                rentals: { type: 'Rental', hasMany: true }
            }
        });
    }

    // shorten for brevity....

    // Initialize the metdataFactory with convenience fns and variables 
    function init(metadataStore, serviceName) {

        var store = metadataStore; // the metadataStore that we'll be filling
        store.namingConvention = breeze.NamingConvention.camelCase;

        // namespace of the corresponding classes on the server
        var namespace = 'FieryRed.ErcApplication.Core.ViewModel.Admin';

        // 'Identity' is the default key generation strategy for this app
        var keyGen = breeze.AutoGeneratedKeyType.Identity;

        // Breeze Labs: breeze.metadata-helper.js
        // https://github.com/Breeze/breeze.js.labs/blob/master/breeze.metadata-helper.js
        // The helper reduces data entry by applying common conventions
        // and converting common abbreviations (e.g., 'type' -> 'dataType')
        helper = new breeze.config.MetadataHelper(namespace, keyGen);      <===================== My problem seems to be caused by this line of code
        helper.addDataService(store, serviceName);

        // addType - make it easy to add the type to the store using the helper
        addType = function (type) {
            return helper.addTypeToStore(store, type);
        };

        // DataTypes we'll be using
        dt = breeze.DataType;
        date = dt.DateTime;
        id = dt.Int32;
        bool = dt.Boolean;

        identity = breeze.AutoGeneratedKeyType.Identity;
    }

    /*** Implementation ***/
    function fillMetadataStore(metadataStore, serviceName) {
        init(metadataStore, serviceName);

        addCommunityInfo();
        addDevicesInfo();
        addGroupInfo();
        // etc.
    }

    // The metadata definition service
    return {
        fillMetadataStore: fillMetadataStore
    };
});
EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2015-01-26 21:33:26

我猜你没有叫require来"breeze.metadataHelper“。您可以通过在metadataFactory.js中设置一个断点并查看它是否存在于breeze.config上来确认它是否已加载。如果不是,那你就没装。

您可以在require顶部显式地使用它,如果这是您使用它的唯一位置。或者让metadataFactory.js依赖它。虽然我还没检查过自己,但这两种方法都应该有效。

p.s.:你可能会发现你过度考虑了你的require配置。违约可能会大幅降低这一水平。另外,"breeze.metadataHelper“已经告诉require,它依赖于breeze

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/28151186

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档