【问题标题】:Can not access properties of model object with an error saying "Cannot redefine property: name" in a Ember handlebar template无法访问模型对象的属性,并在 Ember 车把模板中显示“无法重新定义属性:名称”错误
【发布时间】:2014-03-20 17:38:09
【问题描述】:

在 ember 模板中,我的 model.partners 是一个对象数组,我尝试迭代并打印所有名称属性,但出现错误提示 "Cannot redefine property: name"

{{#each partner in model.partners}}
   <li>
        {{partner.name}}
   </li>
{{/each}}

---> I got an error saying "Cannot redefine property: name"

所以我尝试{{log partner}} helper 看看每个伙伴对象是否正确,它显示正确的对象信息,包括名称属性。

{{#each partner in model.partners}}
   <li>
        {{log partner}}
   </li>
{{/each}}

----> This iteration print all information of model.partners correctly

这是我的 Ember 环境信息。

DEBUG: ------------------------------- 
DEBUG: Ember      : 1.4.0 
DEBUG: Ember Data : 1.0.0-beta.7.f87cba88 
DEBUG: Handlebars : 1.1.2 
DEBUG: jQuery     : 2.0.3 
DEBUG: ------------------------------- 


Ember Inspector ($E): Object {userInfo: Object, partners: (...),__ember1395345243022_meta: Meta} 

这可能是什么问题? 任何帮助将不胜感激。

-编辑

我只是想知道错误消息是什么意思“无法重新定义属性:”以及谁在抱怨这个。

这是当我使用 {{partner.name}} 得到错误时来自 Ember Inspector 的日志,你可以看到 Ember.watchKey 是堆栈的顶部

Transitioned into 'landing'                        libs.js:6215
Transition #0: TRANSITION COMPLETE.                libs.js:6215

Uncaught TypeError: Cannot redefine property: name libs.js:6595
Ember.watchKey                                     libs.js:6595
Ember.watch                                        libs.js:7114
Ember.addObserver                                  libs.js:8386
Ember.View.Ember.CoreView.extend.registerObserver  libs.js:27048
simpleBind                                         libs.js:30930
bindHelper                                         libs.js:31030
(anonymous function)                               libs.js:30978
program1                                           templates.js:130
prog                                               libs.js:475
Ember.View.Ember.CoreView.extend.render            libs.js:26009
Ember.CoreView.Ember.Object.extend._renderToBuffer libs.js:24947
Ember.View.Ember.CoreView.extend._renderToBuffer   libs.js:26578
superWrapper

下面的日志是我使用 {{log partner}} 成功通过控制台看到伙伴对象时得到的日志,你可以在 Ember Inspector 中看到 7 个伙伴对象。出于隐私原因,请理解模糊实际姓名。

Transitioned into 'landing'                       libs.js:6215
Transition #0: TRANSITION COMPLETE.               libs.js:6215

Object {value: 0, name: "ASM", idx: 0}            libs.js:6215
Object {value: 1, name: "Air Force", idx: 1}      libs.js:6215
Object {value: 2, name: "Army", idx: 2}           libs.js:6215
Object {value: 3, name: "Coast Guard", idx: 3}    libs.js:6215
Object {value: 4, name: "Marines", idx: 4}        libs.js:6215
Object {value: 5, name: "Navy", idx: 5}           libs.js:6215
Object {value: 6, name: "Wives", idx: 6}          libs.js:6215

您能指导我如何/从哪里开始调试此问题吗?我有足够的时间来做这件事,让我知道您需要我提供的任何帮助。 谢谢。

【问题讨论】:

  • 认为(不确定)name 可能是受保护的变量名。尝试将其更改为partnerName,看看是否有任何不同。
  • 我也尝试了 {{model.userInfo.uuID}} 但仍然得到“无法重新定义属性:uuID”。当我尝试 {{log model.userInfo.uuID}} 时,我可以通过控制台看到正确的值。

标签: ember.js handlebars.js


【解决方案1】:

你试过这样写循环吗?

{{#each model.partners}}
   <li>
        {{name}}
   </li>
{{/each}}

在每个块中,this 是数组中正在循环的模型。所以 oyu 可以写它{{this.name}} 但这是 inplied 所以它可以被删除。

【讨论】:

  • 提前感谢您的快速回复。不幸的是,使用 {{#each model.partners}} 的 {{name}} 和 {{this.name}} 都不起作用。我的意思是我仍然收到“无法重新定义属性:名称”错误。我想知道谁在抱怨这个错误。
  • 在我看来,您的模型有很多 partners 这个合作伙伴模型?如果这是合作伙伴模型,那么您可以这样做 {{#each}}{{name}}{{/each}} 如果您希望我解释此模式,请告诉我。
  • 让我解释一下我正在使用的模型对象。我可以通过 Ember Inspector 看到以下模型信息。 Ember Inspector ($E): Object {userInfo: Object, partners: (...), __ember1395345243022_meta: Meta} 正如您在此处看到的,该模型的合作伙伴属性包含许多合作伙伴对象。我真的被困在这里了。
  • 您能否为用户和合作伙伴添加您的模型副本。我想知道你是如何建立模型之间的关系的。
  • 仅供参考,我没有使用“DS.Model.extend”为此 Landing 路由器定义模型,而是使用“setupController”钩子在“Landing”路由器中设置模型在登陆模板中可用。这是模型的副本。 {"userInfo":{"uid":0,"username":"","isRegistered":0,"email":""}, "partners":[{"value":0,"name":" ASM","idx":0},{"value":1,"name":"空军","idx":1},{"value":2,"name":"Army","idx ":2},{"value":3,"name":"Coast Guard","idx":3}]} 如您所见,模型对象中没有任何关系。如果您需要更多信息,请随时告诉我。非常感谢。
【解决方案2】:

我终于解决了这个问题。

当我得到错误时,我在模型钩子中使用了以下代码。

model: function() { 
    return new  Ember.RSVP.Promise(function(resolve) {
                 ... 
                 // JSON data from the server
                 //{"userInfo":{"uid":0,"username":"","isRegistered":0,"email":""}, "partners":[{"value":0,"name":"ASM","idx":0},{"value":1,"name":....}...]} 

                 var retObj = {'userInfo':userInfo,'partners':partners};
                 resolve(retObj);
                 ...
                });                    
},

我需要做的是在调用resolve(...) 之前克隆上面的the retObj 变量。 详情请看下面的代码。

我认为,这是因为the retObj 对象具有the userInfo 变量作为Object 类型和the partners 作为Array 类型所以我不应该直接使用the retObj

model: function() { 
    return new  Ember.RSVP.Promise(function(resolve) {
                 ... 
                 // JSON data from the server
                 //{"userInfo":{"uid":0,"username":"","isRegistered":0,"email":""}, "partners":[{"value":0,"name":"ASM","idx":0},{"value":1,"name":....}...]} 

                 var retObj = {'userInfo':userInfo,'partners':partners};
                 var newRetObj = jQuery.extend(true, {}, retObj);
                 resolve(newRetObj);
                 ...
                });                    
},

使用 jQuery.extend() 克隆 retObj 可解决“未捕获的类型错误:无法重新定义属性:*”的错误。

再次感谢所有试图帮助我解决此问题的人,如果您认为我遗漏了什么,请随时发表评论。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2016-06-23
    • 2020-09-27
    • 1970-01-01
    • 1970-01-01
    • 2015-09-22
    • 2013-06-18
    • 2017-05-04
    相关资源
    最近更新 更多