Emberjs 1.x的预Ember.Router问题和Ember.computed(Emberjs

2019-07-03 19:24发布

我读http://code418.com/blog/2012/03/26/advanced-emberjs-bindings/和整个Ember.Binding.and来抓变换这在目前emberjs为Ember.computed已经过时。 我决定更新旧emberjs 0.9.x版本拨弄http://jsfiddle.net/Wjtcj/与emberjs 1.x的工作,并提供了一个Ember.computed.and如图中新小提琴http://jsfiddle.net/ Wjtcj / 5 /。 虽然它的作品,我不能让它返回thesame输出作为旧但当代码的改进版本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');
            }
        })
    })
  })
});

感谢您的任何建议或修正。

Answer 1:

事情在你的例子去错的是我不知道很多,这将是所有的说明,但我觉得这是你要完成的任务: http://jsfiddle.net/machty/Wjtcj/31/

要点

  1. 这是罕见的,你需要手动调用Ember.run.sync(),除非你正在做的测试案例或其他一些异常情况。
  2. 你试图在补习班太多ObjController很多东西。 预期的目的是显示用户及其权限的列表; 我采用使用一个ArrayController来管理用户的列表中的共用图案,并随后被显示每一个与一个用户视图。
  3. 您原来的<error>是由于尝试连接的ApplicationController的出口... ApplicationController中,因此递归和堆栈溢出
  4. 有绑定和计算性能之间的差异。 如果您使用的计算性能,不要在你的财产的末尾把“绑定”

因此,而不是这样的:

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'),


文章来源: Emberjs 1.x-pre- Ember.Router and Ember.computed issues