Javascript-форум (https://javascript.ru/forum/)
-   Общие вопросы Javascript (https://javascript.ru/forum/misc/)
-   -   Переменные, описываемые с помощью @ (https://javascript.ru/forum/misc/33837-peremennye-opisyvaemye-s-pomoshhyu-%40.html)

Jack Sparrow 10.12.2012 13:46

Переменные, описываемые с помощью @
 
Всем привет. Такой вопрос: обращаюсь к переменной модели ASP MVC в Javascript коде:
var listLength = "@(Model.orderList.Count)";

Длина списка считывается нормально в переменную listLength.
Я хочу пройти по всему массиву с помощью цикла, поэтому пишу так:
for (var i = 0; i < listLength; i++) {
          var myGeocoder = ymaps.geocode("Москва @(Model.orderList[i].AddressStreet) @(Model.orderList[i].AddressHome)");

          myGeocoder.then(function (res) { myMap.geoObjects.add(res.geoObjects); });
}

Но вот переменная i не доступна в строке
var myGeocoder = ymaps.geocode("Москва @(Model.orderList[i].AddressStreet) @(Model.orderList[i].AddressHome)");

Не могу понять, почему так, как правильно обращаться к переменной в куске строки @()?

schmetterling 10.12.2012 14:06

Цитата:

Сообщение от Jack Sparrow
var myGeocoder = ymaps.geocode("Москва @(Model.orderList[i].AddressStreet) @(Model.orderList[i].AddressHome)");

var myGeocoder = ymaps.geocode("Москва @(Model.orderList["+i+"].AddressStreet) @(Model.orderList["+i+"].AddressHome)");

Jack Sparrow 10.12.2012 14:10

Я так уже пробовал, но получается, что слово Москва - это строка, и совокупность +i+ это тоже строка, а вот все, что заключено в @() - это не строка. Вот скриншот:


lord2kim 10.12.2012 14:51

Jack Sparrow, попробуй заюзать круглые скобки
var myGeocoder = ymaps.geocode("Москва @(Model.orderList(i).AddressStreet) @(Model.orderList(i).AddressHome)");

ruslan_mart 10.12.2012 14:51

var myGeocoder = ymaps.geocode("Москва "+@(Model.orderList[i].AddressStreet)+" "+@(Model.orderList[i].AddressHome));

Так что ли?

Jack Sparrow 10.12.2012 15:10

Попробовал с кругдыми скобками, так к массиву обращаться нельзя :( А с вынесением слова "Москва " в отдельную строку тоже не проканало. Тут нужен какой-то способ вставить пользовательскую текущую переменную именно в блок @()

lord2kim 10.12.2012 15:11

Jack Sparrow, а так все работает?
var myGeocoder = ymaps.geocode("Москва @(Model.orderList[0].AddressStreet) @(Model.orderList[0].AddressHome)");

Jack Sparrow 10.12.2012 15:14

Попробовал считать список orderList из модели в переменную javascript
var orderList = "@(Model.orderList)";

Но когда обращаюсь к ней, ничего не считывается. Короче она не считалась из модели наверно :(
var myGeocoder = ymaps.geocode("Москва " + orderList[i].AddressStreet + " " + orderList[i].AddressHome);

Jack Sparrow 10.12.2012 15:14

lord2kim, да, так как ты написал - все работает, считывается первый элемент и все нормально отображается

Jack Sparrow 10.12.2012 20:22

А как вообще по-русски называется блок @() ? Я бы загуглил по нему хотя бы)

ruslan_mart 10.12.2012 20:33

Кстати, ф-ции и переменные с символом @ у меня почему-то никогда не работают, может в этом проблема?

Hoshinokoe 10.12.2012 20:35

Jack Sparrow,

Нельзя смешать Javascript (отрабатывает на клиенте) и ASP.NET (отрабатывает на сервере). На момент исполнения Javascript вместо серверной переменной стоит значение, т.е. вместо
var listLength = "@(Model.orderList.Count)";
в html-странице будет так
var listLength = "5";
Если нужно получить доступ на клиенте к модели, то необходимо модель сериализовать и передать на клиентскую часть.
Что-то вроде этого:
var model = @(Json(Model)); // должно преобразовать в вид {orderList: [{AddressStreet: "streeet1"},{...},{...},...]}

И дальше можно работать как с обычным объектом:
for(var i=0; i<model.orderList.length; i++)
{
   var street = model.orderList[i].AddressStreet;
   // и т.д.
}

Jack Sparrow 10.12.2012 20:59

Спасибо за ответ, но не получается преобразовать Model в тип Json, вот такая ошибка в редакторе:


Без кавычек пробовал, то же самое
Сейчас погуглю про конкретное преобразование в тип Json, если что-то найду, отпишусь

Jack Sparrow 10.12.2012 22:23

Странно, попробовал вот так
var model = "@Html.Raw(Json.Encode(Model))";

Но выдает ошибку
Экземпляр ObjectContext был удален и больше не может использоваться в операциях, требующих соединения.
именно на этой строке

Hoshinokoe 11.12.2012 01:06

Jack Sparrow,

1) кавычки не нужны, т.к. получится строка
2) попробуй преобразовать только orderList, остальные поля вроде тебе не нужны на клиенте

var orderList = @Html.Raw(Json.Encode(Model.orderList));

Jack Sparrow 12.12.2012 00:16

Привет, я попробовал поставить без кавычек, но редактор подчеркивает вот так

А когда запускаю, вылетает ошибка:

Jack Sparrow 22.12.2012 22:59

поднимаю снова тему, не могу никак решить проблему


Часовой пояс GMT +3, время: 03:10.