Angular/Breeze — camelCasing в привязке модели

Я только начинаю изучать Angular и работаю с курсом Джона Папы по Pluralsight, чтобы попытаться разобраться в этом. У меня возникла проблема с привязкой некоторых данных к странице, и оказалось, что это неправильный регистр.

Я имел:

 <small>{{s.timeslot.name}}</small> at <small>{{s.room.name}}</small>

когда я должен был:

 <small>{{s.timeSlot.name}}</small> at <small>{{s.room.name}}</small>

Это хорошо, но я просто не могу понять, почему.

Данные возвращаются из веб-API с помощью этого метода (обратите внимание на отсутствие верблюжьего регистра во временных интервалах):

    [HttpGet]
    public object Lookups()
    {
        var rooms = _repository.Rooms;
        var tracks = _repository.Tracks;
        var timeslots = _repository.TimeSlots;
        return new { rooms, tracks, timeslots };
    }

Служба angular, называемая datacontext.js, имеет следующий объект для сопоставления (по крайней мере, насколько я понимаю) имен веб-API и имен объектов Breeze.

    var entityNames = {
        attendee: 'Person',
        person: 'Person',
        speaker: 'Person',
        session: 'Session',
        room: 'Room',
        track: 'Track',
        timeslot: 'TimeSlot'
    }

Есть некоторые дополнительные функции, которые включают кэширование данных и расширение модели на клиенте, но нигде нет ссылки на timeSlot (с camelCase).

Что здесь происходит? Применяется ли Angular к соглашению об обложке HTML?

РЕДАКТИРОВАТЬ: Спасибо Уорду за ответ. Для всех, кто следует тому же курсу и имеет аналогичный вопрос, breeze.NamingConvention.camelCase.setAsDefault() вызывается в entityManagerFactory.js.


person Nathan Power    schedule 20.12.2013    source источник


Ответы (1)


Проблема в некоторой "неряшливости" в написании "TimeSlot" в разных местах.

Ваша привязка к "s" является привязкой к типу Session. Сам тип Session определяет написание любого из своих навигационных свойств. Все остальное не имеет значения.

Метаданные для Session создаются на сервере на основе класса C# Session. Там вы обнаружите, что свойство навигации написано «TimeSlot».

Ваш клиент использует Breeze NamingConvention.camelCase для перевода между предпочтительным PascalCasing C# и предпочтительным CamelCasing в приложениях JavaScript. Поэтому в клиенте Breeze вы должны ожидать, что свойство навигации «TimeSlot» станет «timeSlot».

Имена сущностей не переводятся NamingConvention (в настоящее время). Тип C#, «TimeSlot», также пишется как «TimeSlot» для типа JavaScript.

Любое другое написание в любом другом месте не имеет значения для этой привязки.

Вы можете найти документацию "Отладка результатов запроса" тема полезная.

person Ward    schedule 20.12.2013