Ember - 处理路径时出错:task.edit断言失败:您不能将`undefined`作为id传递给商店的查找方法

时间:2015-07-18 18:49:58

标签: javascript ruby-on-rails ember.js ember-data handlebars.js

我正在开发Ember.js和RoR(Rails 4.0.3和Ruby 2.0)中的应用程序。

Ember版本:

DEBUG: Ember      : 1.12.1                 ember.js?body=1:4875 
DEBUG: Ember Data : 1.0.0-beta.19.2        ember.js?body=1:4875 
DEBUG: jQuery     : 1.11.1                 ember.js?body=1:4875

handlebars v3.0.3

我使用了本教程

http://www.thesoftwaresimpleton.com/blog/2015/04/18/arraycomputed-refactor/

实现一些自定义组件,但没有必要显示它们,它们对主要问题无法解决。

当我想从ListsRoute转到TaskEditRoute时,它会引发错误

Error while processing route: task.edit Assertion Failed: 
  You may not pass `undefined` as id to the store's find method
  Error: Assertion Failed: You may not pass `undefined` as id to the store's find method

-router.js

EmTasks.Router.map(function(){
  this.route("lists", {
    path: '/'
  });

  this.route('profile', {
    path: '/profile'
  });

  this.resource("task", {path: "/task/:task_id"}, function () {
      this.route('edit', {path: "edit"});
  });
});

-lists_route.js

EmTasks.ListsRoute = Ember.Route.extend({
  model: function() {
    return this.store.find('list');
  },

  actions: {
      addList: function(param) {
          this.store.createRecord('list', {
              name: $("#list_name").val()
          }).save();
          $("#list_name").val('');
      }
  }
});

-task_edit_route.js

EmTasks.TaskEditRoute = Ember.Route.extend({
    model: function (params) {
        var url = this.get('router.url');
        var id = url.split("/")[2]

        console.log("TaskEditRoute params:", params);

        return this.store.find("task", id);
    }
});

-lists.handlebars

<div class="row">
  {{#each model as |list|}}
    <div class="col-md-4">
        {{x-list list=list}}     <!-- custom component - working -->

        {{x-add-task list=list}} <!-- custom component - working -->

        {{#each list.tasks as |task|}}

            {{#link-to 'task.edit' task}}
                {{task.name}}
            {{/link-to}}

            <a href='#/task/{{task.id}}/edit'>
                {{task.name}}
            </a>

            {{x-task task=task}} <!-- custom component - working -->
        {{/each}}
    </div>
  {{/each}}
</div>

所以当我点击link-to生成的链接时,

{{#link-to 'task.edit' task}}
  {{task.name}}
{{/link-to}}

它不会将我重定向到新的URL,当我使用console.log检查params时,我可以看到它们是空的。

 TaskEditRoute: params Object {}

此外我收到此错误:

Error while processing route: task.edit Assertion Failed: You may not pass `undefined` as id to the store's find method Error: Assertion Failed: You may not pass `undefined` as id to the store's find method

当我点击自定义的手写链接

 <a href='#/task/{{task.id}}/edit'>
   {{task.name}}
 </a>

我被重定向,但仍然是TaskEditRoute中的params为空。

但我可以获取当前网址(window.location.href或ember way this.get('router.url')),解析它并获取ID。

所以它有效...但它很棘手,很丑。

为什么......标准的做事方式,here无效?

1 个答案:

答案 0 :(得分:3)

您在id路线上定义了动态细分task,而不是task.edit路线。

EmTasks.TaskRoute = Ember.Route.extend({
    model: function (params) {
        console.log("TaskEditRoute params:", params);

        return this.store.find("task", params.id);
    }
});

从Ember 1.4或其他东西开始,子路由将自动使用其父模型,除非子路由选择在其自己的模型钩子中使用不同的东西。因此,您应该拥有父母模型而无需在TaskEditRoute

中执行任何操作