Emberjs访问嵌套属性



这个问题是下面这个memberjs显示从ajax调用返回的对象

继续讲,我为列表中的每个项目生成了一个动态列表,其中包含一些按钮。我用这个类捕捉任何按钮的事件:

App.EnquiriesView = Ember.View.extend({
didInsertElement: function() {
var that = this;
this.$().on('click', '.view-btn', function(){
var id = $(this).attr('data-value');
that.get('controller').send('clickBtn', id);
});
}
});

它进入我的控制器:

App.EnquiriesController = Ember.ObjectController.extend({
actions: {
clickBtn: function( id ) {
console.log('DEBUG: ClickBtn OK id = ' + id);
//console.log(App.Enquiries.findOne(id));
this.transitionToRoute('enquiry', /*App.Enquiries.findOne(id)*/id);
}
}
});

路由器相关:

App.EnquiryRoute = Ember.Route.extend({
model: function( param ) {
console.log('Enquiry id = ' + param.enquiry_id);
return App.Enquiries.findOne(param.enquiry_id);
}
});

和我的地图:

App.Router.map(function() {
this.resource('login', { path: '/' });
this.resource('home');
this.resource('enquiries', function (){
this.route('create');
});
this.resource('enquiry', { path: 'enquiry/:enquiry_id' }, function(){
this.route('update');
});
});

到目前为止,当用户点击按钮时,它会正确地重定向到具有良好URL的查询(例如:/#/inquiry/1)

但问题现在来自我的更新类。我刚刚用动作助手创建了一个按钮来显示更新表单:

App.EnquiryController = Ember.ObjectController.extend({
actions: {
update: function() {
console.log('DEBUG: in EnquiryController update');
console.log(this.get('model'));
this.transitionToRoute('enquiry.update');
}
}
});

因此,当你点击更新按钮时,你会被重定向到这种URL:/#/inquiry/definned/update,而不是/#/Inquiry/1/update。。。

我不知道这是怎么发生的,也不知道我如何在这个过程中失去我的身份证。。。

谢谢你的帮助。

[edit]如果你需要知道什么是我的findOne函数:

findOne: function(id) {
return $.ajax({
url: host + 'mdf/enquiry/' + id,
type: 'GET',
accepts: 'application/json',
success: function (data) {
console.log('DEBUG: GET Enquiry ' + id + ' OK');
},
error: function() {
console.log('DEBUG: GET Enquiry ' + id + ' Failed');
}
});
}

它在您单击列表中的相关按钮后,从服务器获取每个项目的数据。

这是我得到的对象:

Object {readyState: 1, getResponseHeader: function, getAllResponseHeaders: function, setRequestHeader: function, overrideMimeType: function…}
abort: function ( statusText ) {
always: function () {
complete: function () {
done: function () {
error: function () {
fail: function () {
getAllResponseHeaders: function () {
getResponseHeader: function ( key ) {
overrideMimeType: function ( type ) {
pipe: function ( /* fnDone, fnFail, fnProgress */ ) {
progress: function () {
promise: function ( obj ) {
readyState: 4
responseJSON: Object
responseText: "{"ok":true,"enquiry":{"id":1,"domainid":"domain","userid":"userid","status":null,"type":"new","customerName":"Marco","customerEmail":"Marco@email.com",...}"
setRequestHeader: function ( name, value ) {
state: function () {
status: 200
statusCode: function ( map ) {
statusText: "OK"
success: function () {
then: function ( /* fnDone, fnFail, fnProgress */ ) {
__proto__: Object

这里有很多问题。你正在做的几件事都是非常"非成员"的惯用语,如果结果出现更多问题,我也不会感到惊讶。但我会专注于所问的问题,如果你想要更多关于调整进一步细分市场的建议,我很乐意提供。

简而言之,您有以下代码:

this.resource('enquiry', { path: 'enquiry/:enquiry_id' });

在您的地图中,但一个看起来类似的查询对象:

{"ok":true,
"enquiry":{
"id":1,
"domainid":"motorpark",
"userid":"motorpark/mpuser"‌​
...
}   
}

这些不匹配。映射定义它由模型中不存在的字段enquiry_id*序列化。要解决此问题,您可以使用以下解决方案之一:

解决方案1:调整您的模型

如果你想保持地图原样,你需要调整你的模型,使其具有enquiry_id字段,例如:

{"ok":true,
"enquiry_id":1,
"enquiry":{
"id":1,
"domainid":"motorpark",
"userid":"motorpark/mpuser"‌​
...
}   
}

解决方案2:调整地图(推荐)

不过,更改地图更容易。要做到这一点,请将地图上的查询资源替换为:

this.resource('enquiry', {path: 'enquiry/:enquiry.id'});

.告诉ember所需的元素是enquiry对象内的id字段。

您还需要修改访问param值的方式。因为您将参数的元素命名为enquiry.id,所以在检索值时需要将其指定为变量名,而不是路径。在您的路线上,更改的所有实例

param.enquiry_id

收件人:

param['enquiry.id']

最新更新