【问题标题】:Ember - Switch from one state to another's nested stateEmber - 从一种状态切换到另一种的嵌套状态
【发布时间】:2012-12-28 23:10:22
【问题描述】:

我有以下代码。 (我只是复制路由器,因为该应用程序目前大约有 500 行) 我需要的是从状态“房间”切换到“guests.new”。

当我进入房间状态时,它会加载一个模板,在该模板中我调用操作“newGuest”以将状态更改为“newGuest”屏幕。但我无法让它工作。 在萤火虫我得到这个错误:

g[a] is undefined

这是路由器代码。 希望你能帮助我。

App.Router = Ember.Router.extend({
        enableLogging:true,
        location:'hash',
        gotoRooms:Ember.Route.transitionTo('rooms.index'),
        gotoGuests:Ember.Route.transitionTo('guests.index'),
        gotoBookings:Ember.Route.transitionTo('bookings'),
        gotoHome:Ember.Route.transitionTo('root.index'),

        root:Ember.Route.extend({
            index:Ember.Route.extend({
                route:'/',
                connectOutlets:function (router) {
                    App.HomeView.appendTo('#main-content .container_12');
                },
                enter: function(){
                    console.log('Entro Home');
                },
                exit: function(){
                    App.HomeView.remove();
                }
            }),
            guests:Ember.Route.extend({
                route:'/guests',
                index:Ember.Route.extend({
                    route:'/',
                    connectOutlets:function(router) {
                        App.GuestsView.appendTo('#main-content .container_12');    
                    },
                    enter: function(){
                        console.log("Entro Guests");
                    },
                    exit: function(){
                        App.GuestsView.remove();
                    },
                }),
                new:Ember.Route.extend({
                    route:'/new/:bed',
                    deserialize: function(manager, params) {
                        console.log('New Guest \nBed:'+params['bed']+"\n Date:"+params['date']);
                        App.GuestView.appendTo('#main-content .container_12');
                    },
                    connectOutlets:function(){
                        alert("hola");
                    },
                    exit: function(){
                        App.GuestsView.newGuestView.remove();
                    }
                })
            }),
            rooms:Ember.Route.extend({
                newGuest:Ember.Route.transitionTo('guests.new'),
                route:'/rooms',
                index:Ember.Route.extend({
                    route:'/',                    
                    connectOutlets:function(router) {
                        App.RoomsView.appendTo('#main-content .container_12');    
                    },
                    enter: function(){
                        console.log("Entro Rooms");
                    },
                    exit: function(){
                        App.RoomsView.remove();
                    }
                })
            })
        })
    });

感谢@Akash,但它仍然无法正常工作。 我正在使用 ember-1.0.pre。 调用'newGuest'的模板如下:

  <script type="text/x-handlebars" data-template-name="rooms">
      {{#each room in App.Rooms}}
        <div class="grid_4">
      <div class="block-border">
        <div class="block-header">
          <h1>{{room.screen}}</h1><span></span>
        </div>
        <div class="block-content">
          <ul class="block-list">
          {{#each bed in room.camas}}
            {{#if bed.guestId}}
            <li {{action "viewGuest" on="click"}} class="occupied">{{bed.id_guest}}</li>
            {{else}}
            <li class="free" {{action "newGuest" on="click"}}>Free Bed</li>
            {{/if}}
          {{/each}}
          </ul>
        </div>
      </div>
    </div>
      {{/each}}
    </script>

我也尝试过使用 ember-latest,因为我已经在各种线程中读到了预版本给出了一些路由问题。 现在事实证明,使用 ember-latest,我无法定义计算属性。至少这是加载页面时控制台上弹出的内容。

有什么线索吗?

非常感谢!

【问题讨论】:

    标签: ember.js nested ember-old-router


    【解决方案1】:

    问题在于 Ember 无法从 rooms 路由中访问 guests 路由。所以你需要做的就是将动作函数移到树的下方。我在下面稍微调整了你的代码:

    调整代码:

    App.Router = Ember.Router.extend({
            enableLogging:true,
            location:'hash',
            gotoRooms:Ember.Route.transitionTo('rooms.index'),
            gotoGuests:Ember.Route.transitionTo('guests.index'),
            gotoBookings:Ember.Route.transitionTo('bookings'),
            gotoHome:Ember.Route.transitionTo('root.index'),
    
            root:Ember.Route.extend({
                newGuest:Ember.Route.transitionTo('guests.new'),
                index:Ember.Route.extend({
                    route:'/',
                    connectOutlets:function (router) {
                        App.HomeView.appendTo('#main-content .container_12');
                    },
                    enter: function(){
                        console.log('Entro Home');
                    },
                    exit: function(){
                        App.HomeView.remove();
                    }
                }),
                guests:Ember.Route.extend({
                    route:'/guests',
                    index:Ember.Route.extend({
                        route:'/',
                        connectOutlets:function(router) {
                            App.GuestsView.appendTo('#main-content .container_12');    
                        },
                        enter: function(){
                            console.log("Entro Guests");
                        },
                        exit: function(){
                            App.GuestsView.remove();
                        },
                    }),
                    new:Ember.Route.extend({
                        route:'/new/:bed',
                        deserialize: function(manager, params) {
                            console.log('New Guest \nBed:'+params['bed']+"\n Date:"+params['date']);
                            App.GuestView.appendTo('#main-content .container_12');
                        },
                        connectOutlets:function(){
                            alert("hola");
                        },
                        exit: function(){
                            App.GuestsView.newGuestView.remove();
                        }
                    })
                }),
                rooms:Ember.Route.extend({
                    route:'/rooms',
                    index:Ember.Route.extend({
                        route:'/',                    
                        connectOutlets:function(router) {
                            App.RoomsView.appendTo('#main-content .container_12');    
                        },
                        enter: function(){
                            console.log("Entro Rooms");
                        },
                        exit: function(){
                            App.RoomsView.remove();
                        }
                    })
                })
            })
        });
    

    【讨论】:

    • 这很有趣,把你的 newGuest:Ember.Route.transitionTo('guests.new'), 改成 newGuest: function() {console.log("event failed");},这将告诉我们您的活动是否真正达到了功能。还要检查你的括号,它们似乎没有对齐。
    • 改了,还是一样的错误。括号是什么意思?他们似乎与我一致
    • 我认为您的操作的语法可能有误,应该是 {{action newGuest this href=true}}。这将在点击时自动注册。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2022-06-23
    • 1970-01-01
    • 1970-01-01
    • 2022-11-17
    • 1970-01-01
    相关资源
    最近更新 更多