无法访问模型对象的属性,并在Ember手柄模板中显示“无法重新定义属性:名称”的错误

时间:2014-03-20 17:38:09

标签: ember.js handlebars.js

在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}}帮助器来查看每个伙伴对象是否正确,它显示正确的对象信息,包括name属性。

{{#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} 

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

- 编辑

我只是想知道错误信息的含义&#34;无法重新定义属性:&#34;谁在抱怨这个。

当我使用{{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

您是否会指导我如何/从何处开始调试此问题?我有足够的时间来帮助我,让我知道你需要的任何帮助。 感谢。

2 个答案:

答案 0 :(得分:0)

您是否尝试过编写这样的循环?

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

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

答案 1 :(得分:0)

我终于解决了这个问题。

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

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);
                 ...
                });                    
},

我需要做的是在调用the retObj之前克隆resolve(...)变量。 有关详细信息,请参阅以下代码。

我认为,这是因为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解决了错误说&#34; Uncaught TypeError:无法重新定义属性: * &#34;。

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