【问题标题】:Emberjs access a nested propertyEmberjs 访问嵌套属性
【发布时间】:2014-02-26 14:59:33
【问题描述】:

这个问题是emberjs display an object return from an ajax call的下面这个问题

稍微恢复一下,我为该列表的每个项目生成了一个带有一些按钮的动态列表。我用这个类捕捉到任何按钮的事件:

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 的查询(例如:/#/enquiry/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:/#/enquiry/undefined/update 而不是 /#/enquiry/1/update ...

我不知道这是怎么发生的,我不知道在这个过程中我怎样才能丢失我的身份证...

感谢您的帮助。

[编辑] 如果你想知道我的 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

【问题讨论】:

  • 问题是您的模型与enquiry_id 的任何属性都不匹配。 App.Enquiries.findOne(param.enquiry_id) 返回什么?
  • 它返回与id相关的查询。如果您单击 id=1 的第一个项目,则 url 将是 /#/enquiry/1 并且 findOne 将在我的服务器上获取数据。
  • 是的...但是那是什么数据?您面临的整个问题都围绕着这样一个事实,即您的模型数据的格式与您的地图预期接收的格式不同。提供作为模型返回的对象。
  • 它是一个对象,其中我有一个名为: responseText: "{"ok":true,"enquiry":{"id":1,"domainid":"motorpark","userid ":"motorpark/mpuser","status":null,"type":"new","customerName":"Marco","customerEmail":"Marco@email.com","customerPhone":"0123456789", ...}}"
  • 请将其添加到帖子中,而不是作为评论。不格式化真的不可读。

标签: ember.js


【解决方案1】:

这里有很多问题。您正在做的一些事情是非常“非余烬”的惯用语,如果结果出现更多问题,我不会感到惊讶。但我会专注于提出的问题,如果您想获得更多关于调整更多细分的建议,我很乐意提供。

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

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 字段。

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

param.enquiry_id

收件人:

param['enquiry.id']

【讨论】:

  • 我知道我的项目中有很多非 ember 正在做,但这是因为我正在并行使用 YUI,这使得 ember 有点复杂。否则我会使用 {{#link-to}} 也可以使用 ember-data 访问我的查询...我已经尝试了您的第二个解决方案,但它不起作用,似乎模型无法获取参数 ID,但我在我的视图和控制器中正确地理解了它。
  • 我已经完成了更改,但仍然未定义......即使我想显示参数我只得到:[object Object]
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2012-11-12
  • 2015-01-01
  • 2018-06-03
  • 2019-03-12
  • 1970-01-01
  • 2020-08-25
  • 1970-01-01
相关资源
最近更新 更多