Ember js pre 4 - 路由器在链接点击时无法解析id

时间:2013-01-30 06:21:38

标签: ember.js

我有一个帐户列表,然后我有一个查看链接来详细查看帐户,这是帐户路线。当我点击视图链接时(guid)在通过路由器时不会更新,它只会在URL中更新,但它似乎不会继续执行代码。

当我进行浏览器刷新时,(guid)会被传递到路由器......由于某种原因它无法解决。

我没有使用余烬数据,但将来会使用它。

以下是我的“帐户”模板代码,其中包含“查看”链接:

{{#each accountdata in controller}}
<tr>
<td>{{accountdata.accountnumber}}</td>
<td>{{accountdata.accountname}}</td>
<td>{{accountdata.accounttypestatus}}</td>
<td>{{accountdata.accountuser}}</td>
<td>{{#linkTo account accountdata}}View{{/linkTo}}</td>
</tr>
{{/each}}

accountdata是“accountguid”的上下文,这是我的身份。

这是我的路由器:

App.Router.map(function() {
    this.resource("accounts", { path: '/accounts' });
    this.resource("account",  { path: "/accounts/:accountguid" });
});

App.AccountsRoute = Ember.Route.extend({
    setupController: function(controller, model) {
        controller.set('searchfilter','ALL');
        controller.search();
    }
});

App.AccountRoute = Ember.Route.extend({
    setupController: function(controller, model) {        
        controller.show(controller);
    },
    model: function(params) {
        this.controllerFor('account').set('accountguid',params.accountguid);        
    },
    serialize: function(model) {
        return {accountguid: Em.get(model, 'accountguid')}
    }
});

我的controller.show是我发送上下文来调用脚本以显示帐户详细信息的地方。

所以我只需要查看每次不执行正确的accountguid然后调用show(context)方法。

由于

这是我的旧路由器代码,100%工作。当我点击一个链接时,它解决了:accountguid,当我刷新浏览器时,它做了同样的事情。我没有任何问题,一切正常。

//         //Accounts
//         accounts: Ember.Route.extend({
//             route: '/accounts',
//             index: Ember.Route.extend({
//                 route: '/',
//                 connectOutlets: function (router) {
//                     router.get('applicationController').connectOutlet('accounts');
//                     router.get('accountsController').set('searchfilter','ALL');
//                     router.get('accountsController').search();
//                 }
//             }),
//             view: Ember.Route.extend({
//                 route: '/:accountguid',

//                 connectOutlets: function (router, account) {
//                     router.get('applicationController').connectOutlet('account', account);
//                     router.get('accountController').show(account);                    

//                     //router.get('accountController').connectOutlet('eventloghistory','eventloghistory');                    
//                 }
//             })
//         }),

3 个答案:

答案 0 :(得分:1)

我设法用以下代码解决了我的问题。我现在能够刷新浏览器,我能够点击链接,它将通过当前的:accountguid使用show()方法。

App.AccountRoute = Ember.Route.extend({
    model: function(params) {
        return {accountguid: params.accountguid};
    },
    setupController: function(controller, model) {        
        controller.show(model);
    },
    serialize: function(model) {
        return {accountguid: Em.get(model, 'accountguid')}
    }
});

答案 1 :(得分:0)

将您的路由器地图更改为以下内容,它应该可以正常工作

App.Router.map(function() {
  this.resource("accounts", function(){
    this.resource('account',{path:':account_id'});
  }); 
});

答案 2 :(得分:0)

请向我们展示您的AccountsController和AccountController背后的代码。如果你为整个结构提供一个jsfiddle,那将是最有用的。

一般来说,您可能不知道新的事物流。以下是两种情况中发生的情况: 1.您可以通过设置URL(例如/ account / 5)导航到AccountRoute。 1.1。 AccountRoute的'model'钩子叫做

model: function(params) {
    return your model here...
}

使用params = {accountguid:5}。因为您没有使用ember-data,所以应该实现此钩子并初始化并返回模型。 1.2。使用AccountController调用setupController挂钩,并使用模型钩子返回模型。没有背后的代码

controller.show(controller);

目的还不是很明确,但你应该做点什么呢

setupController: function(controller, model) {
  this._super(controller, model);
  controller.set('content', model);
  controller.show(model);
}

正如您所看到的,通过不实现模型挂钩,您的URL保持正确,但路由不知道如何构建所需的模型资源。

  1. 您可以通过linkTo调用

    转换到路线

    {{#linkTo account accountdata}}查看{{/ linkTo}}

  2. 在这里,linkTo期望accountdata成为路线的完整帐户模型。这意味着它可能不会仅携带像id这样的部分数据(请阅读此文章以获取许可:In latest Ember, how do you link to a route with just the id/name of a model, rather than providing all of its attributes in the linking page?)。 2.1。 AccountRoute的模型钩子被 NOT 调用。 AccountRoute模型属性设置为传递给linkTo的对象(在我们的示例中为“accountdata”)。 2.2。使用AccountController和accountdata对象调用setupController。 如果您的accountdata对象不完整,那么在此处创建一个完整的实例并将其设置为控制器是明智的。

    您可以想象,如果您的accountdata类似于{id:5,accountname:“John”,accounttypestatus:“A”,...},那么点击linkTo后,该网址将正确更新为/ account / 5,但帐户模板将接收帐户数据,而不是实际帐户。

    P.P。如果以上都不是任何帮助,这可能是您的问题:https://github.com/emberjs/ember.js/issues/1709