11

我们正在使用 EmberJS 编写应用程序。然而,我们仍然是这个框架的新手,我们很难解决一些看似直截了当的问题。

该模型非常简单,有 3 个模型:Queue、Task 和 Image。我们为所有路由使用动态 URI 段,这些模型的路由嵌套在以下形式:: queue_id/:task_id/:image_id。

路由是这样配置的:

App.Router.map(function() {
   this.resource('queue', {path: ':queue_id'}, function() {
      this.resource('task', {path: ':task_id'}, function() {
         this.resource('image', {path: ':image_id'});
      });
   });
}

在 HTML 的某个地方,我们有一个简单的模板来遍历任务中的所有图像:

{{#each task.images}}
   <li>
      {{#view App.ThumbnailView.contentBinding="this"}}
         <img {{bindAttr src="thumbnail.url"}} />
      {{/view}}
   </li>
{{/each}}

这是缩略图视图的代码:

App.ThumbnailView = Ember.View.extend({
   tagName : 'a',
   click : function(e) {
       var task = //assume this value exists;
       var queue = //assume this value exists;
       var image = //assume this value exists;

       this.get('controller.target.router').transitionTo('image', queue, task, image);
   }
});

最后,这是我们的 ImageRoute:

App.Image = Ember.Object.extend();
App.Image.reopenClass({
    find : function(image_id) {
       //This is where I set a breakpoint
       console.log(image_id);
    }
});

App.ImageRoute = Ember.Route.extend({
    model : function(params) {
      //image_id is the last uri segment in: #/1/1/1
      return App.Image.find(params.image_id);
    }
});

问题: 调用this.get('controller.target.router').transitionTo()似乎有效。我可以看到,当我单击其中一个缩略图视图时,URL 会发生变化(例如,从 /1/1/2 变为 /1/1/3 之类的东西)。但是,我没有在 UI 中看到任何状态变化。此外,我放置断点的行似乎没有被触发。但是当我刷新页面时,它运行良好。

我的转换代码有问题吗?

谢谢。

4

1 回答 1

13

有两点需要注意:

首先,而不是

this.get('controller.target.router').transitionTo('image', queue, task, image);

利用:

this.get('controller').transitionToRoute('image.index', queue, task, image);

这可能不会改变行为,但它更符合 Ember 的习惯。

第二件事如下:

内部转换不会触发model路由上的钩子,因为 Ember 假设您正在传递模型以及转换,因此无需调用model钩子,因为您已经传递了模型。

这就是为什么你的断点没有被触发,find没有被调用(因为它不应该)。

我没有足够的信息来找到您的问题,但是如果我从页面刷新有效而内部转换无效这一事实猜测是传递给的对象transitionTo之间以及从返回的对象之间存在不一致model钩。

您应该将确切的对象传递给钩子transitionTo返回的对象。model

如果你正在做:

this.get('controller').transitionToRoute('image.index', queue, task, image);

并且它不起作用,您正在传递的 , 或模型queue可能task有问题。image

所以这:

   var task = //assume this value exists;
   var queue = //assume this value exists;
   var image = //assume this value exists;

不是很有帮助,因为它可能是问题所在。

于 2013-05-10T10:25:11.560 回答