[ Поиск ] - [ Пользователи ] - [ Календарь ]
Полная Версия: Js для сайта такси
ADiel
Очень тяжело работать с JS, практически первый раз, да еще и такой большой и замороченный :) YMaps, JQuery

Имеется своя гео-база. Гео базу яндекса не используем совсем, только координату с карты.

И так:
Есть несколько классов.
MtOrder, - вся логика заказа
MtAddress, - класс адреса, состоящего из 3 MtPlace
MtPlace - место на карте

Это 3 основных, ломающих мне мозг, не смотря на то, что я их придумал. :D

http://html.multitaxi.ru/map.html

Вот тут все лежит.


Я не стал копировать код, т.к. он все время меняется.

Логика работы:
1 Ситуация. - Заполнение адресов заказа такси вручную. {
Двойной автокомплит. Вводим текст, получаем улицу, открываем автокомплит с другим source для выбора дома ( в этот момент курсор ужке стоит на карте, как точка А). То же самое с точкой б. Сервер посылает координаты и строки адреса.
После нажатия кнопки "поехали", данные будут отправляться на сервер в виде заказа... Но это уже другая уже реализованная история.
}

2 Ситуация. - Заказ такси только по кликам на карте. {
Юзер кликнул на точку А и точку Б, сервер получил эти координаты, вернул координаты домов из базы, строки адресов. Чел жмет "Поехали", данные отправились, все счастливы.
}

3 Ситуация. - Смешанная {
Чел вводил адрес, потом кликнул на карту, потом стер и ввел заново.
Тут начинает мешать одно другому, т.к. при ручном вводе адреса, происходит полное перестроение маршрута. И наоборот.

}


Я придумал ключ (фокус на input - вводит вручную, не посылаем запросы к серверу при перестроении маршрута) ну и наоборот.


Вообщем у меня не хватает мозгов на воплощение своего же алгоритма и конструкции. Кстати, первая версия работала, но 3 Ситуация.... Прошу помощи в наведении порядка в классах JS, т.к. не знаю этот язык.




<script type="text/javascript">



$(function () {

Order = new MtOrder();

$(".address").bind().change(function(){

Order.addAddress($(this).attr("id"));

});

Map = new MtMap("#map");

Map.addListeners();

});



</script>



// Местоположение
var MtPlace = createClass({
str: null, // Название места
id: null, // id из базы
lat: null, // Широта (х)
lon: null, // Долгота (у)

construct: function(str) {
console.log(typeof(str));
this.reset();
if (typeof(str) == 'string'){
this.search(str);
} else if(typeof(str) != 'undefined'){
this.searchByCoords(str);
}
}
,
// Поиск места по строке
search: function(str){
this.str = str;
this.id = 1;
this.lat = 33.88;
this.lon = 55.77;
return true;
},
searchByCoords: function (data){
console.log(data);
this.str = data.str;
this.id = data.id;
this.lat = data.x;
this.lon = data.y;
},
// Обнуление
reset: function(){
this.str = null;
this.id = null;
this.lat = null;
this.lon = null;
}
}
);

/**
* @
todo: Посылать в конструктор только сформированные данные.
* @
todo: Написать функции формирования данных
*/
// Адрес

var MtAddress = createClass({
city: null, // Место - город
street: null, // Место - улица
build: null, // Место - строение
str: null, // Строка адреса
input: null,
autocomplete: null,
construct: function(id, data){
this.input = $("#"+id);
this.reset(id);

var obj = {}; // Данные для заполнения
if (data){
$.ajax({
url: "/ajax/FindAddress.html",
data: "term="+data[0]+","+data[1],
dataType: 'json',
async: false,
success: function(data){
$("#"+id).val(data.str);
obj = data;
},
error: function(e){
$('body').html(e.responseText);
}
}
);

this.build = new MtPlace(obj.build);
this.street = new MtPlace(obj.street);
this.city = new MtPlace(obj.city);
}

}
,
reset: function(id){
this.city = new MtPlace();
this.street = new MtPlace();
this.build = new MtPlace();
this.input = $("#"+id);
this.autocomplete = new MtAutocomplete(this.input);
this.str = null;
}
}
);

MtAutocomplete = createClass({

construct: function(input){
this.input = input;
$(this.input).autocomplete({
source: function( request, response ) {
// Проверяем введенное и меняем source
$.getJSON( "/ajax/searchstreet", {
term: request.term
}, response );
},
minLength: 1,
select: function(event, ui){
Map.createRoad();
console.log('CreateRoad');
},
search: function(event, ui){
}
,
create: function(event, ui){
//$(this.input).autocomplete("search");
}
}
);
},

input: false,
currentmode: 'build',
// Улица + город
street: {

}
,
// Строение
build: {
source: function( request, response ) {

// Проверяем введенное и меняем source
$.getJSON( "/ajax/searchstreet", {
term: request.term
}, response );
},
minLength: 1,
select: function(event, ui){
Map.createRoad();
console.log('CreateRoad');
},
search: function(event, ui){
}
,
create: function(event, ui){
console.log(this.input);
$(this.input).autocomplete("search");
}
}
}
);


// Заказ
var MtOrder = createClass({
addresses: createClass({}),
construct: function(){
this.reset();
},
addAddress: function(id){
this.addresses[String(id)] = new MtAddress(String(id));
},
ajaxAddress: function(id, data){
this.addresses[String(id)] = new MtAddress(String(id), data);
},
removeAddress: function(id){
delete this.addresses[String(id)];
},
getAddress: function(id){
return this.addresses[id];
},
addOrder: function(){
var KeyPattern = /^a\d{1}$/;
$.each(this.addresses, function(key, val){
if(key.match(KeyPattern)){
alert(Order.getAddress(key).str);
}
}
);
},
reset: function(){
this.addresses = createClass({});
this.addAddress('a0');
}
}
);


var Order = new Object;




var MtMapPoints = createClass({
// Сами точки
p0: null,
p1: null,
p2: null,
p3: null,
p4: null,

construct: function(){
this.p0 = null;
this.p1 = null;
this.p2 = null;
this.p3 = null;
this.p4 = null;
},

// Функция перезагрузки точек
rebuild: function(helper){
var WayPoint = false;
// Обнуление текущих точек
this.p0 = null;
this.p1 = null;
this.p2 = null;
this.p3 = null;
this.p4 = null;
// Перебор точек с карты
for (var i=0; i<6; i++){
WayPoint = helper.getWayPoint(i);
// Кончились точки - завершаем цикл
if (!WayPoint)
break;
// Добавляем значение к точке
this['p'+i] = WayPoint.data.point;
Order.ajaxAddress('a'+i, WayPoint.data.point);

}
}
,
// Map.points.get() - вернет все точки
// Map.points.get('p1') - вернет точку p1

get: function(one){
var KeyPattern = /^p\d{1}$/;
if(one.match(KeyPattern)){
// Отдаем одну
return this[one];
} else {
var ret = {};
$.each(this, function(key, val){
if(key.match(KeyPattern)){
ret[key] = val;
}
}
);
// Отдаем несколько
return ret;
}
}
}
);

var MtMap = createClass({

map: new Object(),
// Точки маршрута на карте
points: new Object(),
// Плагины
plugins: new createClass({
// Модель редактора маршрутов
routerModel: new Object(),
// Редактор маршрутов
routerEditor: new Object()
}),

construct: function(container){
this.map = new YMaps.Map($(container));
this.points = new MtMapPoints();

this.plugins.routerModel = new YMaps.RouterEditor.RouterModel();
this.plugins.routerEditor = new YMaps.RouterEditor.DragAndDropEditor(this.plugins.routerModel,{
maxPoints: 2
});
this.map.addControl(this.plugins.routerEditor);

var zoom = 12;
//if (YMaps.location || false == true) {
// center = new YMaps.GeoPoint(YMaps.location.longitude, YMaps.location.latitude);
// if (YMaps.location.zoom) {
// zoom = YMaps.location.zoom;
// }
//} else {

center = new YMaps.GeoPoint(38.1681, 56.3211);
//}



this.map.setCenter(center, zoom);

this.plugins.routerEditor.startDrawing();

},
clear: function(){
this.plugins.routerEditor.clear();
this.plugins.routerEditor.startDrawing();
},
addListeners: function(){
// Ловим событие изменения маршрута
YMaps.Events.observe(
this.plugins.routerModel,
this.plugins.routerModel.Events.RouterResultChange, function (event) {
var helper = new YMaps.RouterEditor.RouterResultHelper(event);
// Перезагружаем точки маршрута
Map.points.rebuild(helper);
});
},
createRoad: function(){
var key=0;
var points = new Array();
while (addr = Order.getAddress('a'+key)){
if (!addr)
break;
console.log(addr);

if (addr.build.id){
points[points.length] = new YMaps.GeoPoint(addr.build.lat, addr.build.lon);
} else if (addr.street.id) {
points[points.length] = new YMaps.GeoPoint(addr.street.lat, addr.street.lon);
} else if (addr.city.id) {
points[points.length] = new YMaps.GeoPoint(addr.city.lat, addr.city.lon);
}
key++;
}

}
}
);

var Map = new Object();
/**
* $(function () {
Map = new MtMap("#map");
Map.addListeners();
});
*/


Для тех, кто скажет, что такое только за деньги:
free-lance 3 исполнителя с хорошим портфолио сказали, что не потянут. 2 жителя форума сказали, что топик надо сделать :)



Спустя 2 минуты, 52 секунды (18.03.2012 - 03:10) ADiel написал(а):
Сейчас проблема в создании MtPlace. т.к. может создаваться из 2 разных место по-разному. Писать класс - потомок или как? Мне кажется, что я еще сильнее запутаюсь.

Скрытый текст
Я либо псих, либо ненормальный

Спустя 5 минут, 45 секунд (18.03.2012 - 03:15) ADiel написал(а):
m4a1fox, я знаю, тебе есть, что добавить =)

Спустя 42 минуты, 37 секунд (18.03.2012 - 03:58) bodja написал(а):
Да уж,тут даже ящик пива не поможет rolleyes.gif

Спустя 2 минуты, 51 секунда (18.03.2012 - 04:01) inpost написал(а):
Я не понял, 1-2 работало, а проблема была только в третьем пункте, или в первом и втором тоже?

Спустя 41 минута, 7 секунд (18.03.2012 - 04:42) ADiel написал(а):
В третьем. Сейчас над автокомплитом бьюсь. Мне кажется, я сообразил как сделать. Допишу код - будет ясно smile.gif

Спустя 26 минут, 40 секунд (18.03.2012 - 05:09) ADiel написал(а):
Прекрасная ночь smile.gif Мозги сами отвечают на вопрос по конструкции срипта и алгоритмам его работы, но не в состоянии ответить жене, хочу ли я чай smile.gif))

Спустя 8 минут, 43 секунды (18.03.2012 - 05:17) inpost написал(а):
ADiel
Аналогично.

Если проблема взаимодействия, то можешь пойти дубово, при переключении режима выбора - перезагружай страницу, чтобы выбирали с нуля smile.gif

Спустя 2 минуты, 10 секунд (18.03.2012 - 05:19) ADiel написал(а):
Не пойдет. Там много данных кроме как в js нигде не хранится. С куками морочиться не прет

Спустя 3 часа, 22 минуты, 58 секунд (18.03.2012 - 08:42) ADiel написал(а):
Работает о0
Когда сделаю этот скрипт на основной странице сайта, обязательно всем покажу smile.gif

Спустя 53 минуты, 23 секунды (18.03.2012 - 09:36) ADiel написал(а):
http://html.multitaxi.ru/ вот он. Правда автокомплит потом будет еще хитрее и интереснее.


_____________
Ищи меня тут (ilyaplot)
Быстрый ответ:

 Графические смайлики |  Показывать подпись
Здесь расположена полная версия этой страницы.
Invision Power Board © 2001-2025 Invision Power Services, Inc.