2

私はhttp://code418.com/blog/2012/03/26/advanced-emberjs-bindings/を読んでいて、 Ember.Computedの現在のemberjsで非推奨になっているEmber.Binding.andに出くわしました。古いemberjs0.9.xフィドルhttp://jsfiddle.net/Wjtcj/を更新してemberjs1.xで動作するようにし、新しいフィドルhttp://jsfiddle.net/に示すようにEmber.computed.andを提供することにしました。Wjtcj /5/。それは動作しますが、古いものと同じ出力を返すようにすることはできませんが、コードhttp://jsfiddle.net/Wjtcj/28/の改善されたバージョンが失敗した場合

 STATEMANAGER: Sending event 'navigateAway' to state root.
 STATEMANAGER: Sending event 'unroutePath' to state root.
 STATEMANAGER: Sending event 'routePath' to state root. 
 STATEMANAGER: Entering root.index
 <error>

setSync関数が問題であり、計算されたプロパティを呼び出しているため失敗しているようです。

The handlebars template:

<script type="text/x-handlebars" data-template-name="application" >

 {{outlet}}
</script>


<script type="text/x-handlebars" data-template-name="obj" >
 {{#each App.ObjController}}
    <p>{{this}}</p>
 {{/each}}
</script>​

更新します。更新されたコードhttp://jsfiddle.net/Wjtcj/28/については、このリンクを使用してください。以下のコードは適用されなくなります

 App = Ember.Application.create();

  Ember.computed.and = function(dependentKey, otherKey) {    
    return Ember.computed(dependentKey, otherKey, function(key) {
    return get(this, dependentKey) && get(this, otherKey);    
   });
  };


 Ember.computed.or = function(dependentKey, otherKey) {    
    return Ember.computed(dependentKey, otherKey, function(key) {
    return get(this, dependentKey) || get(this, otherKey);    
   });
 };


 App.ApplicationController = Em.Controller.extend();

 App.ApplicationView = Ember.View.extend({
   templateName: 'application'
 });


App.ObjView = Em.View.extend({
   templateName: 'obj'
});

App.ObjController = Ember.ArrayController.extend({
  content: [],
  user: Ember.Object.create({isAdmin: false, isOwner: false}),

  isSelected: false,
  isSaveEnabled: false,
  canRead: false,
  isSaveEnabledBinding: Ember.computed.and('user.isAdmin', 'isSelected'),
  canReadBinding: Ember.computed.or('user.isAdmin', 'user.isOwner'),
  setSync: function(property, value) {
    this.set(property, value);
    Ember.run.sync(); // synchronize bindings
    this.pushObject('isSaveEnabled = %@ ; canRead = %@'.fmt(this.get('isSaveEnabled'),     this.get('canRead')));
   }
  });

  App.ObjController.setSync('isSelected', false);
  App.ObjController.setSync('user', Ember.Object.create({isAdmin: true, isOwner: false}));
  App.ObjController.setSync('isSelected', true);
  App.ObjController.setSync('user', Ember.Object.create({isAdmin: false, isOwner: true}));
  App.ObjController.setSync('user', Ember.Object.create({isAdmin: false, isOwner: false}));


 App.Router = Ember.Router.extend({
   enableLogging: true,
   location: 'hash',
   root: Ember.Route.extend({
    index: Ember.Route.extend({
      route: '/',
        connectOutlets: function(router) {
      router.get('applicationController').connectOutlet('application');
        }

      }),

    obj: Ember.Route.extend({
       route: '/obj',
       enter: function(router) {
         console.log("The obj sub-state was entered.");
       },

        index: Ember.Route.extend({
          route: '/',
          connectOutlets: function(router, context) {
                router.get('applicationController').connectOutlet( 'obj');
            }
        })
    })
  })
});

</ p>

提案や修正をありがとう。

4

1 に答える 1

3

あなたの例では多くの問題が発生しており、これがすべての実例になるかどうかはわかりませんが、これがあなたが達成しようとしていることだと思います:http: //jsfiddle.net/machty/Wjtcj/31/

重要なポイント

  1. テストケースやその他の異常な状況を実行している場合を除いて、Ember.run.sync()を手動で呼び出す必要があることはめったにありません。
  2. あなたはObjControllerにあまりにも多くのものを詰め込もうとしていました。意図された目的は、ユーザーとその特権のリストを表示することです。ArrayControllerを使用してユーザーのリストを管理するという一般的なパターンを採用し、UserViewで各ユーザーを表示しました。
  3. あなたのオリジナル<error>は、applicationControllerのアウトレットを... applicationControllerに接続しようとしたためでした。したがって、再帰とスタックオーバーフローが発生しました。
  4. バインディングと計算されたプロパティには違いがあります。計算されたプロパティを使用している場合は、プロパティの最後に「Binding」を付けないでください

したがって、これの代わりに:

isSaveEnabledBinding: Ember.computed.and('user.isAdmin', 'isSelected'),
canReadBinding: Ember.computed.or('user.isAdmin', 'user.isOwner'),

これを行う

isSaveEnabled: Ember.computed.and('isAdmin', 'isSelected'),
canRead: Ember.computed.or('isAdmin', 'isOwner'),
于 2012-11-15T08:23:52.610 に答える