Изборът на вход AngularJS с целочислена стойност в ng-model спира да работи

Имам приложение, написано на C# .NET, използващо WebApi и AngularJS.

В някои моменти от моето приложение попълвам избран маркер с опции, използвайки ENUMS, защото тъй като стойностите не са в базата данни, не чувствам необходимост да създавам услуга, която връща enums, защото използвам страници за бръснене така че мога да използвам преброяванията директно.

Всичко работеше добре, докато не актуализирах версията на angular до 1.4.7, след това спря да работи и не мога да понижа версията на angular (поради някои корпоративни причини).

Например имам този код

<div class="col-md-3 col-xs-12">
    <label for="qualificacaoCobreJunta" class="col-xs-12 control-label">@IsiCTB.Internationalization.Res.Controls.label_cobre_junta<span class="obrigatorio">*</span></label>
    <div class="col-xs-12">
        <select class="form-control" id="qualificacao-cobre-junta" name="qualificacaoCobreJunta" ng-model="qualificacao.cobrejunta"
                required>
            <option value="" id="cobrejunta-0">@IsiCTB.Internationalization.Res.Controls.label_prompt_selecione</option>
            <option id="optCobreJuntaCom" value="@IsiCTB.Entities.Enums.ComSem.Com.ToInt()">@IsiCTB.Entities.Enums.ComSem.Com.GetValueString()</option>
            <option id="optCobreJuntaSem" value="@IsiCTB.Entities.Enums.ComSem.Sem.ToInt()">@IsiCTB.Entities.Enums.ComSem.Sem.GetValueString()</option>
            <option id="optCobreJuntaAmbos" value="@IsiCTB.Entities.Enums.ComSem.Ambos.ToInt()">@IsiCTB.Entities.Enums.ComSem.Ambos.GetValueString()</option>
            <option id="optCobreJuntaNA" value="@IsiCTB.Entities.Enums.ComSem.NA.ToInt()">@IsiCTB.Entities.Enums.ComSem.NA.GetValueString()</option>
        </select>
        <div ng-show="formQualificacaoSubmitted" class="error-form-validation">
            <div ng-show="gerenciaQualificacoesSoldador.qualificacaoCobreJunta.$error.required">@IsiCTB.Internationalization.Res.Controls.label_obrigatorio</div>
        </div>
    </div>
</div>

Кодът получава данни от WebApi.

QualificacaoService.get({ id: idQualificacao }, function (data) {
    $scope.qualificacao = data;
});

И това връща JSON обект с куп атрибути, като този:

{
  id: 1,
  cobrejunta: 2,
  anotherEnumField: 1,
  anotherEnumField2: 5,
  anotherEnumField3: 2
  ....
}

Ако имам настройка като qualificacao.cobrejunta = "2" (низ) в модела, изборът сочи към правилната опция, но ако имам qualificacao.cobrejunta = 2 (цяло число), отколкото нищо не изглежда да работи.

Има все пак това да работи отново, или единственото (най-добро) решение е да създадете услуга, която ще поиска API, и този API ще изгради масива и след това ще го върне за използване на ng-option?

Благодаря ви момчета.


person Erick Gallani    schedule 17.11.2015    source източник
comment
Във вашия ъглов код опитайте да конвертирате стойността в низ, преди да я присвоите на модела, би било хубаво, ако можете да я споделите и с нас.   -  person Fedaykin    schedule 17.11.2015
comment
Имате предвид използването на $watch в $scope за конвертиране в низ? Не поставих своя ъглов код, защото наистина не правя нищо там, просто го изпращам на моя webapi.   -  person Erick Gallani    schedule 17.11.2015
comment
Където и да правите присвояването на модел... qualificacao.cobrejunta = "2" получавате ли стойности от webapi или само ги изпращате? Ако случаят е такъв, трябва да видим какво става по жицата.   -  person Fedaykin    schedule 17.11.2015
comment
Получавам стойностите от моя уеб API, когато влизам във формуляра в режим на редактиране. Моят WebApi ми изпраща стойностите в цяло число, това е проблемът. Тъй като angular търси стойностите в низ.   -  person Erick Gallani    schedule 17.11.2015
comment
Това е кодът, който бих искал да видя, където присвоявате стойностите, които сте получили от webapi, към вашия модел. Предполагам, че ако направите просто преобразуване в низ, ще работи.   -  person Fedaykin    schedule 17.11.2015
comment
@Fedaykin Редактирах въпроса си, като поставих кода, който искате да видите.   -  person Erick Gallani    schedule 18.11.2015


Отговори (2)


Това се обсъжда тук.

Всичко, което трябва да направите, е да промените избора си, както е показано по-долу

<select class="form-control" id="qualificacao-cobre-junta" name="qualificacaoCobreJunta" ng-model="qualificacao.cobrejunta" required
    ng-options="entry.value as entry.label for entry in [{value : @IsiCTB.Entities.Enums.ComSem.Com.ToInt(), label: '@IsiCTB.Entities.Enums.ComSem.Com.GetValueString()'}, {value: @IsiCTB.Entities.Enums.ComSem.Sem.ToInt(), label: '@IsiCTB.Entities.Enums.ComSem.Sem.GetValueString()'}, {value: @IsiCTB.Entities.Enums.ComSem.Ambos.ToInt(), label: '@IsiCTB.Entities.Enums.ComSem.Ambos.GetValueString()'}, {value:@IsiCTB.Entities.Enums.ComSem.NA.ToInt(), label: '@IsiCTB.Entities.Enums.ComSem.NA.GetValueString()'}]">
</select>
person Manos Pasgiannis    schedule 17.11.2015

Мисля, че поведението на Angular се промени с версия 1.4.8. Имах същия проблем: имах списък със стойности в комбо (статични стойности) и присвоих динамично стойността за избор чрез контролера. Не беше проблем с версия 1.3.8, но е с 1.4.8, когато избраната стойност остава празна. Но мога да покажа стойността в изгледа и тя е правилна.

Начинът да реша това за мен беше да преведа тези статични стойности в обект, съдържащ тези стойности, и да го дефинирам в началото на контролера (преди да присвоя стойността). Странно е да трябва да го правя, но не намерих друг път към успеха.

person Enrique    schedule 21.01.2016