ruby - 加载路线 : TypeError: undefined is not a function 时出错

标签 ruby ember.js local-storage ubuntu-12.04 ember-data

我真的希望 emberjs 团队的人能读到这篇文章。

我是一位非常有经验的程序员,精通多种语言。

& 就 AFA ember 而言,它不是学习曲线,我也不觉得缺乏知识和教程, 相反,我认为是框架和开发环境资源的不断变化消耗了大量的时间、精力和精力, 当各种 SO 问题和谷歌引用不同/旧版本的框架时,试图找出问题所在。

我发现这里需要某种配置图表,说明什么与什么一起工作以及如何配置您的开发环境。

有很多答案不一定指向正确的方向,这很难描述,但我有点感觉文档在框架向前运行时落后了。

我经历了所有 José Mota很棒的教程,在构建实际书签应用程序的最后阶段,我遇到了很多问题,以至于学习 emberjs 不是主要问题,而是它周围的基础架构消耗了大部分时间。

它从 ruby​​ 版本开始,并在 ubuntu 12.04 上管理这些版本,ember-data ruby 的依赖项(仅使用 ruby​​ 1.9 编译),到 localstorage_adapter.js以及如何在 ember 中使用它... github 页面上给出的示例对于后者不起作用。

配置:
Ubuntu 12.04.4 Ember 1.4.1+pre.af87bd20 jquery-1.9.1 Handlebars -v1.3.0 Ember 数据 1.0.0-beta.7.f87cba88 ruby 1.9.2p290

正在关注 José Mota's great tutsplus course 所以这是我的问题:

Error while loading route: TypeError: undefined is not a function
at App.BookmarksNewRoute.Ember.Route.extend.model (http://localhost:8000/js/app/routes/bookmarks_new.js:3:23)
at superWrapper [as model] (http://localhost:8000/js/vendor/ember.js:1239:16)

应用程序代码(我会尽量清楚):

路线

文件名:bookmarks_new.js

App.BookmarksNewRoute = Ember.Route.extend({
model: function() {
    return App.Bookmark.createRecord();
}

})

模型

文件名:bookmark.js

App.Bookmark = DS.Model.extend({
title: DS.attr("string"),
url: DS.attr("string")

})

文件名:router.js

App.Router.map(function () {
    this.resource("bookmarks", function(){
    this.route("new");
    });
});

文件名:store.js

(1)
App.Store = DS.Store.extend({
revision: 14,
adapter: DS.LSAdapter
});
(2)
App.Store = DS.Store.extend();
App.ApplicationAdapter = DS.LSAdapter;
(3)
App.Store = DS.Store.extend();
App.ApplicationAdapter = DS.LSAdapter.extend({
    namespace: 'bookmarks'
});
(4)
App.ApplicationSerializer = DS.LSSerializer.extend();
App.ApplicationAdapter = DS.LSAdapter.extend({
  namespace: 'bookmarks'
});

数字 1 和 4 有效,但哪一个是正确的? 数字 2,3 在 SO 或谷歌上找到了不同的答案,为不同的人解决了这个问题。

Controller

文件名:bookmarks.js

App.BookmarksController = Ember.ArrayController.extend();

文件名:bookmarks_new.js

App.BookmarksNewController = Ember.ObjectController.extend({
save: function() {
    this.get("model.transaction").commit();
    // this.get("model").get("transaction").commit(); // similiar
    this.get("router").transitionTo("bookmars");
}
});

index.html

** 这里是应用程序(也是通过找出另一个人的问题)脚本在 inbdex.html 中的顺序是至关重要的:

<script type="text/javascript" src="js/vendor/jquery-1.9.1.js"></script>
<script type="text/javascript" src="js/vendor/handlebars-v1.3.0.js"></script>
<script type="text/javascript" src="js/vendor/ember.js"></script>
<script type="text/javascript" src="js/vendor/ember-states.js"></script>
<script type="text/javascript" src="js/vendor/ember-data.js"></script>

<script type="text/javascript" src="js/app/app.js"></script>
<script type="text/javascript" src="js/app/router.js"></script>
<script type="text/javascript" src="js/vendor/localstorage_adapter.js"></script>
<script type="text/javascript" src="js/app/store.js"></script>

<script type="text/javascript" src="js/app/controllers/bookmarks.js"></script>
<script type="text/javascript" src="js/app/controllers/bookmarks_new.js"></script>

<script type="text/javascript" src="js/app/models/bookmark.js"></script>

<script type="text/javascript" src="js/app/routes/bookmarks_new.js"></script>

最后是标记

<script type="text/x-handlebars" data-template-name="bookmarks">
    <h2>All my Bookmarks</h2>
    <table>
        <thead>
            <tr>
                <th>Title</th>
                <th>URL</th>
            </tr>
        </thead>

        <tbody>
            {{#each controller}}
            <tr>
                <td>{{title}}</td>
                <td>{{url}}</td>
            </tr>
            {{else}}
            <tr>
                <td>U have No bookmarks</td>
            </tr>
            {{/each}}
        </tbody>
    </table>
    {{#link-to "bookmarks.new"}}Add new bookmark{{/link-to}}
    {{outlet}}
</script>
<script type="text/x-handlebars" data-template-name="bookmarks/new">
    <h3>New Bookmark</h3>
    <form {{action "save" on="submit"}}>
        <p>
            {{view Ember.TextField valueBinding="title" placeholder="type in a title"}}
        </p>
        <p>
            {{view Ember.TextField valueBinding="url" placeholder="type in a URL"}}
        </p>
        <p>
            <button>Create Bookmark</button>
        </p>
    </form>
</script>

OK,所以点击“添加新书签”会产生上述错误。

为什么??

谢谢你抽出时间...embereres...

如果您发现任何信息缺失,请告诉我。

最佳答案

每当我遇到这些问题时:

Error while loading route: TypeError: undefined is not a function

这通常意味着:

  • 您的其中一条路线的模型函数没有返回任何内容(缺少返回语句)
  • 您要求的模型不存在
  • 您的 XHR 一直失败,因此 model() 函数返回未定义

检查浏览器开发人员工具中的网络选项卡,以验证您是否获得了预期的数据返回。对于本地存储适配器,您需要检查是否从中得到了您期望的结果。

编辑:也许我在今年早些时候的一次 session 演示中录制的这个截屏视频也可能有所帮助:https://www.youtube.com/watch?v=KH5RreHtaaQ

关于ruby - 加载路线 : TypeError: undefined is not a function 时出错,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/22661563/

相关文章:

Ruby 获取对象键作为数组

ruby - 如何在 Ruby on rails 中访问 Controller 中的 hidden_​​field

javascript - 观察当前时间的 Ember 计算属性

javascript - 为什么我在调试器中可以看到数据时 window.localStorage 是空的?

jwt - Blazor : Missing Authorization Header when reloading a page

ruby - 如何在 Ruby 中获取多维哈希中的键?

ruby-on-rails - 我如何在 ruby​​ on rails 中按相关性排序

javascript - Ember - Controller 的内容和模型属性有什么区别

javascript - i18n - 如何在 application.hbs 中使用它?

javascript - 如何存储/检索元素移动的最后位置?