对于这个问题的长度,我深表歉意,但我缺乏将其缩短的洞察力。
我正在尝试学习 Ember.js,但在理解控制器之间的关系时遇到了一些麻烦。特别是因为它与控制器属性和视图绑定有关。我有一个可以工作的应用程序......但我真的不明白为什么&我觉得(很明显)这不是'Ember.js'的方式。
需要考虑的一些事项:根据我在指南/文档中解释为“正确”结构的内容,此应用程序被分解为目录/文件,此应用程序在 sinatra 应用程序的上下文中运行。这个应用程序虽然不完整,但到目前为止确实按我期望的方式工作。
该应用程序不完整,但这里是我期望和我正在尝试做的事情的一般概述:
1) 用户到达根 URL '/' 并转换到 '/locate' URL。
2) LocateController 获取用户位置,用 lat/lng 填充两个表单字段。
3) 表单以 POST 形式提交给服务器,以 ajax 形式发送到 sinatra '/locate' 路由。
(请求由服务器处理)
4) 用户被转换到 ember.js '#/located' 路由。
5) 信息作为 JSON 对象从服务器返回并显示
到目前为止,我只实施了第一步。如果我添加了提交按钮,则可以发送表单,但想法是让它自动发生。
定位视图中的字段使用表单字段的正确值填充。但是,我使用直接 jQuery 来更新值,在我看来,这不是在 ember.js 应用程序中执行此操作的“正确”方式
下面是我的一些代码。为简洁起见,我将只提供片段,因为我觉得如果您知道正确的答案,您将能够从提供的片段中得出它。
我的视图是这样设置的: 我在我的 sinatra 应用程序中使用 slim
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="assets/js/app/application.js"
应用程序视图.js
Application.ApplicationView = Ember.View.extend({
templateName: 'application'
});
Application.LocateView = ApplicationView.extend({
templateName: 'locate'
});
Application.LocatedView = ApplicationView.extend({
templateName: 'located'
});
应用控制器.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 --",
});
路由器.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');
}
});
我已经阅读了 ember.js 网站上的指南和 API 文档,并查看了 GitHub 上的 repo。我觉得“正确”的实现会为纬度和经度属性使用计算属性,但我不太明白它在实践中是如何工作的。
此外,我知道很可能有更好的方法来处理将信息发送到服务器(可能是 JSON 或 ember-data,当我走到那一步时?),并随时分享您对此的任何见解。但是现在,由于我对 sinatra 及其工作方式感到满意,我更喜欢一个不需要对我的后端进行重大重构的解决方案。(也就是说,能够从 sinatra 的 params[:hash] 访问位置数据)。
提前感谢您的帮助并花时间阅读这个相当长的问题。