加载路径时出错:TypeError:undefined不是函数

时间:2014-03-26 12:48:19

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

我真的希望来自emberjs团队的人会读到这个。

我是一位经验丰富的程序员,使用多种语言。

&安培; AFA余烬关注,它不是学习曲线,也不是缺乏知识和教程 相反,我认为它是框架和来源的不断变化。开发环境,消耗大量的时间,精力和精力, 当各种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 车把V1.3.0 ember-data 1.0.0-beta.7.f87cba88 红宝石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)

应用程序代码(我会尽量明确):

路由

filename:bookmarks_new.js

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

})

模型

filename:bookmark.js

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

})

filename:router.js

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

filename: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工作,但哪一个是正确的? 在SO或谷歌不同的答案中找到的数字2,3可以解决不同人的问题。

控制器

filename:bookmarks.js

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

filename: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>

确定,点击“添加新书签”&#39;产生上述错误。

为什么?

感谢您的时间...... embereres ......

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

1 个答案:

答案 0 :(得分:0)

每当我遇到这些问题时:

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

通常意味着:

  • 您的某个路线的模型功能不返回任何内容(缺少返回语句)
  • 你要的是一个不存在的模型
  • 您的XHR在此过程中失败,因此model()函数返回undefined

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

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