2016-04-10 10 views
0

サービスによって提供される配列に由来するオブジェクトの属性 'show'を設定しようとしています。サービスから配列のオブジェクトにEmberが値を設定しました

サービス(ない問題):私のコントローラで

// services/events.js 
export default Ember.Service.extend({ 
types: [ 
    {"code": 0, "label": 'Performance', "show": true, "css": 'warning'}, 
    {"code": 1, "label": 'Preview', "show": true, "css": 'danger'}, 
    .... 
], 
}); 

私は属性「ショー」を更新しなければならないアクションを持っている:

// controller 
const { service } = Ember.inject; 

export default Ember.Controller.extend({ 
    eventsService: service('events'), 
    .... 
    actions: { 
     setEventFilter: function(code) { 
      .... 
      let obj = this.get('eventsService.types').objectAt(code); 
      // I get a proper Object here, that also has a set-function: 
      console.log(obj); 
      // this fails with 'Uncaught TypeError: obj.set is not a function': 
      obj.set('show', false); 
     } 
    } 
}); 

私はここで答えを読んだEmber: set array value for specific keyすべての可能性を試したが、私の場合は何も働かなかった。

enter image description here

任意の提案:私は理解していない何

は、私は、コンソールで「設定」関数を参照することができ、まだ私はまだそのエラーを取得していること、ありますか?誰かが私が間違っていることを考えている?

私も試してみました:

console.log(obj.show); // working! gives me right value 
console.log(obj.get('show'); // same error (but with get of course...) 
obj.show = false; // gives error 'Assertion Failed: You must use Ember.set() to set the `show` property (of [object Object]) to `false`.' 

答えて

0

オブジェクトアレイ内部:

{"code": 0, "label": 'Performance', "show": true, "css": 'warning'}, 

はエンバーオブジェクトではないので、もちろんそれに定義されてset方法を有していません。あなたは、単に以来、もちろん

obj.show = false; 

、これはあなたがこのオブジェクトから計算されたプロパティまたはオブザーバーをハングアップ(または動的テンプレート内のそのプロパティへの参照を更新)することはできませんを言って、そのプロパティのいずれかを設定することができますPOJOには、その機械のどれも利用できません。あなたはエンバーオブジェクトとしてこれを扱いたい場合は、それがなければならない、よく、エンバーオブジェクトは、そのような

types: [ 
    Ember.Object.create({"code": 0, "label": 'Performance', "show": true, "css": 'warning'}), 
    Ember.Object.create({"code": 1, "label": 'Preview', "show": true, "css": 'danger'}), 
    .... 
], 

としてこれは、サブオブジェクトエンバーオブジェクトを作成しますが、typesはまだ昔ながらのJSですオブジェクト、あなたはまだあなたがもののようなものが仕事をしたい場合は、あなたにも配列自体エンバーオブジェクトを作成する必要がありますので、

typeCss: Ember.computed.map('types', 'css') 

のようなことを行うことができなくなりますので。

が動作する理由は、Ember.setがPOJOでも作業する方法を知っているからです。いくつかのEmberのようなものがPOJOで動作する状況がありますが、私はそれらに依存しないことに注意してください。

この動作は、サービスからのオブジェクトには何の影響もありません。

+0

すべての追加情報をありがとうございます! – Jeff

0

私は作業は自分自身を答えた:

Ember.set('obj.show', false); 

をしようとしたとき、私はエラー「セットが3つのつか4つの引数で呼び出さなければなりません受けました。オブジェクト、プロパティキー、値および/偽寛容true」に

は、だから私はこれを試してみました:

Ember.set(obj,'show', false); 

仕事をすることが判明何!私は、少なくとも3つの引数を取るsetとは異なるバージョン、について聞いたことがない理由

はまだ私が....興味

私は、これは他の誰かに便利ですね!

関連する問題