0

次のオブジェクト構造があり、特定のタイトル値を取得してから、新しい値に設定する必要があります。ネストされたオブジェクト内に入ると、Ember オブジェクトの .get() および .set() メソッドが失われることを私は知っています。標準の JavaScript の方法で値を設定しようとすると、ember.set() を使用する必要があるというエラーが発生しました。

これは、App.job.code への変更を観察したときに起こりたいことですが、Assertion failed: You must use Ember.set() to access this property (of [object Object]) が表示されます。

updateTitle: function(){
    App.jobs.jobProducts[0].allocations[0].allocationTitle = "test2";
}.observes("App.job.code")

これはどのように達成するのが最善でしょうか? ありがとう

App.jobs = [
  {
    id: 0,
    jobTitle: "This is the only job",
    jobProducts: [
      {
        id: 0,
        productTitle: "Product 1",
        allocations:[
          {
            id: 0,
            allocationTitle: "Allocation 1",
            deliverys:[
              {
                id: 0,
                deliveryTitle: "Delivery 1"
              },
              {
                id: 1,
                deliveryTitle: "Delivery 2"
              }
            ]
          },
          {
            id: 1,
            allocationTitle: "Allocation 2",
            deliverys:[
              {
                id: 0,
                deliveryTitle: "Delivery 3"
              },
              {
                id: 1,
                deliveryTitle: "Delivery 4"
              }
            ]
          }
        ]
      },
      {
        id: 1,
        productTitle: "Product 2",
        allocations:[
          {
            id: 0,
            allocationTitle: "Allocation 3",
            deliverys:[
              {
                id: 0,
                deliveryTitle: "Delivery 5"
              },
             {
               id: 1,
               deliveryTitle: "Delivery 6"
             }
           ]
          },
          {
            id: 1,
            allocationTitle: "Allocation 4",
            deliverys:[
              {
                id: 0,
                deliveryTitle: "Delivery 7"
              },
              {
                id: 1,
                deliveryTitle: "Delivery 8"
              }
            ]
          }
        ]
      }
    ]
  }
];
4

1 に答える 1

0

標準のバニラの方法でオブジェクトにアクセスしても問題はありません: http://jsbin.com/odosoy/74/edit

次のようなことを試してみてください。

console.log("Title before: "+App.jobs[0].jobProducts[0].allocations[0].deliverys[0].deliveryTitle);

App.jobs[0].jobProducts[0].allocations[0].deliverys[0].deliveryTitle = "FOO";

console.log("Title after: "+App.jobs[0].jobProducts[0].allocations[0].deliverys[0].deliveryTitle);

アップデート:

それについて考えた後、私見これは、ユースケースのようなことをどのように行うべきか、この方法で後で使用できるベストプラクティスで.set()あり.get()、フレームワークが提供する他のすべての機能です。

リレーションシップを使用してモデルを定義する

App.Job = DS.Model.extend({
  jobTitle: DS.attr('string'),
  jobProducts: DS.hasMany('App.JobProduct')
});

App.JobProduct = DS.Model.extend({
  productTitle: DS.attr('string'),
  allocations: DS.hasMany('App.Allocation')
});

App.Allocation = DS.Model.extend({
  allocationTitle: DS.attr('string'),
  deliveries: DS.hasMany('App.Delivery')
});

App.Delivery = DS.Model.extend({
  deliveryTitle: DS.attr('string')
});

そして、それを実現するためのいくつかのフィクスチャ:

App.Job.FIXTURES = [
  {
    id: 1,
    jobTitle: "This is the only job",
    jobProducts: [1,2]
  }
];

App.JobProduct.FIXTURES = [
  {
    id: 1,
    productTitle: "Product 1",
    allocations:[1,2]
  },
  {
    id: 2,
    productTitle: "Product 2",
    allocations:[3,4]
  }  
];

App.Allocation.FIXTURES = [/* shortened */];

App.Delivery.FIXTURES = [/* shortened */];

ここで完全に動作するデモを参照してください。

それが役に立てば幸い。

于 2013-08-23T11:17:50.487 に答える