Прошу прощения за длину этого вопроса, но мне не хватает проницательности, чтобы сделать его коротким.Ember.js Controller & View Binding (the ember.js way ...)
Я пытаюсь изучить Ember.js & У меня возникли проблемы с пониманием взаимосвязи между контроллером, который он видит. В частности, поскольку это относится к свойствам контроллера & вид привязок. У меня есть небольшое приложение, которое работает ... Но я не совсем понимаю, почему & Я чувствую, что (довольно очевидно) это не способ «Ember.js».
Некоторые вещи, которые необходимо учитывать: это приложение разбито в директорию/файлы в соответствии с тем, что я интерпретировал в руководствах/документации как «правильную» структуру. Это приложение работает в контексте приложения синатра. Это приложение, хотя и неполное, работает так, как я ожидаю.
приложение является неполным, но вот общий обзор того, что я ожидаю &, что я пытаюсь сделать:
1) Пользователь приходит в корневой URL «/» и переход к «/ местонахождение 'URL.
2) LocateController захватывает местоположение пользователей, заполняет два поля формы с помощью lat/lng.
3) Форма отправляется на сервер как POST на маршрут sinatra/locate как ajax.
(запрос обрабатывается сервером)
4) Пользователь перешел на '# /, расположенной' The ember.js маршрута.
5) Информация поступает от сервера в виде объекта JSON & отображается
Я до сих пор реализован только шаг один. Форма может быть отправлена, если я добавлю кнопку отправки, но идея состоит в том, чтобы это произошло автоматически.
Поля в виде локации заполняются правильными значениями полей формы. Тем не менее, я использую прямое jQuery для обновления значений, и мне кажется, что это не «правильный» способ сделать это в приложении ember.js.
Здесь следует некоторый код. Для краткости я просто предоставил фрагменты, как мне кажется, если вы знаете правильный ответ, вы сможете получить его из предоставленных выдержек.
Мои взгляды настроены так: Я использую тонкий в моем Синатра приложение
script type="text/x-handlebars" data-template-name="application"
| {{ outlet }}
script type="text/x-handlebars" data-template-name="locate"
| {{ message }}
| <form id="coordinates">
| {{view Ember.TextField id="latitude" name="latitude" valueBinding="latitude" class="latitude"}}
| {{view Ember.TextField id="longitude" name="longitude" valueBinding="longitude" class="longitude"}}
| </form>
script type="text/x-handlebars" data-template-name="located"
| <p id="message">{{ message }}</p>
| <p id="latitude">{{ latitude }}</p>
| <p id="longitude">{{ longitude }}</p>
сценарий SRC = "активы/JS/приложение/application.js"
applicationView.js
Application.ApplicationView = Ember.View.extend({
templateName: 'application'
});
Application.LocateView = ApplicationView.extend({
templateName: 'locate'
});
Application.LocatedView = ApplicationView.extend({
templateName: 'located'
});
applicationController.JS
var GeoLocation;
GeoLocation = (function(location){
$('#latitude').val(location.coords.latitude),
$('#longitude').val(location.coords.longitude)
});
navigator.geolocation.getCurrentPosition(GeoLocation)
Application.ApplicationController = Ember.Controller.extend({
message: "Hello from Application"
});
Application.LocateController = Ember.Controller.extend({
message: "Hello from Locate",
latitude: "-- lat --",
longitude: "-- lng --",
});
Application.LocatedController = Ember.Controller.extend({
message: "Hello from Located",
latitude: "-- lat --",
longitude: "-- lng --",
});
router.js
Application.Router.map(function() {
this.route('index');
this.route('locate');
this.route('located');
});
Application.ApplicationRoute = Ember.Route.extend({
events: {
goToLocate: function() {
this.transitionTo('locate');
},
goToLocated: function() {
this.transitionTo('located');
}
}
});
Application.IndexRoute = Ember.Route.extend({
redirect: function() {
this.render('application');
this.transitionTo('locate');
}
});
Application.LocateRoute = Ember.Route.extend({
redirect: function() {
this.render('locate');
//this.transitionTo('located');
}
});
});
Application.LocatedRoute = Ember.Route.extend({
renderTemplate: function(controller) {
this.render('located');
}
});
Я прочитал Руководства & Документация по API на сайте ember.js, а также смотрели на репо на GitHub. Я чувствую, что «правильная» реализация использовала бы рассчитанные свойства для атрибутов долготы широты &, но я не совсем понимаю, как это работает на практике.
Кроме того, я знаю, что, скорее всего, лучший способ справиться с получением информации на сервере (возможно, как JSON или ember-data, когда я получаю так далеко?), И не стесняйтесь делиться информацией, которую вы можете есть относительно это. Но на данный момент, поскольку мне комфортно с синатрой и как это работает, я бы предпочел решение, которое еще не требует серьезного рефакторинга моего бэкэнда. (т. е. иметь возможность доступа к данным местоположения из параметров sinatra [: hash]).
Заранее благодарим за помощь & Не торопитесь, чтобы прочитать этот довольно длинный вопрос.
Это именно то, что я искал! Спасибо большое! Я знал, что прямой jQuery не был ответом. –
Итак, я предполагаю, что импликация этого будет заключаться в том, что отправка формы как ajax с прямым jQuery тоже не является ответом. Есть ли процедура для этого случая в ember? Что-то настолько простое и зависимое от экземпляра похоже, что оно должно жить в моем маршруте или контролере? или это будет точкой, о которой я должен начать думать о разработке некоторых моделей? –
Похоже, я тоже слишком скоро сказал =/Я думаю, что ваше решение кажется правильным. Однако добавление кода в мое приложение и комментирование моих битов jQuery GeoLocation оставляет меня пустыми текстовыми полями. –