ember.js中的动作助手抛出错误

时间:2012-07-31 21:18:25

标签: ember.js

以下代码失败,并显示消息“Uncaught TypeError:Object data-ember-action =”4“没有方法'replace'” - 似乎Handlebar助手获得了缺少所述方法的Handlebar SafeString。

请注意,三重支撑动作{{{action ...}}}似乎有效。

    <h1>Skills</h1>

    <script type="text/x-handlebars" data-template-name="skill-list">
        <table class="datagrid" style="width: 100%">
            <thead>
            <tr>
                <td colspan="5" class="controls">
                    Search <input type="text" value="" class="search_field"/>
                </td>
            </tr>
            <tr>
                <th class="id_sort">ID</th>
                <th class="name_sort">Name</th>
                <th class="basis_sort">Basis</th>
                <th class="type_sort">Type </th>
                <th>&nbsp;</th>
            </tr>
            </thead>
            <tbody>
            {{#view SKILLS.skill_items }}

            {{#each skills }}
            <tr>
                <td>
                    {{ _id }}
                </td>
                <td>{{ name }}</td>
                <td>{{ basis }}</td>
                <td>{{ type }}</td>
                <td class="control">
                    <button class="edit"><span class="icon"></span> Edit</button>
                </td>
            </tr>
            {{/each }}

            {{/view }}
            </tbody>
            <tfoot>
            <tr>
                <th class="id_sort">ID</th>
                <th class="name_sort">Name</th>
                <th class="basis_sort">Basis</th>
                <th class="type_sort">Type </th>
                <th>&nbsp;</th>
            </tr>
            <tr>
                <td colspan="5" class="controls">

                    <button class="add" {{action "add_skill"}} >Add Skill
                    </button>
                </td>
            </tr>
            </tfoot>
        </table>
    </script>

    <script type="text/x-handlebars" >
        {{view SKILLS.skills_view}}
    </script>​

    <script language="javascript">

        var SKILLS;

        $(function () {
            SKILLS = Ember.Application.create({

                Skill: Ember.Object.extend({
                    id: 0,
                    name: '',
                    basis: ''
                }),

                skills: [],

                add_skill: function(){

                }

            });

            SKILLS.skills = _.map([
                {name:"throwing", basis:"speed", type: 'skill', _id:0},
                {name:"spech", basis:"will", type: 'skill', _id:1}
            ], function(s){ return _.extend(new SKILLS.Skill(), s)});

            SKILLS.skill_items = Ember.View.extend({
                skillsBinding: 'SKILLS.skills'
            });

            SKILLS.skills_view = Ember.View.extend({
                templateName:'skill-list',
                add_skill: function(){
                    SKILLS.add_skill();
                }
            });

        })
    </script>

1 个答案:

答案 0 :(得分:3)

以下是您的代码的工作版本:http://jsfiddle.net/Sly7/2F2y9/ 我已经清理了一些奇怪的代码(事实上,对我来说很奇怪,特别是_.map()或_.extend()),删除了不必要的视图,尊重Ember Naming Conventions

但在某些方面,对我来说并不完全干净。

<h1>Skills</h1>

<script type="text/x-handlebars" data-template-name="skill-list">
    <table class="datagrid" style="width: 100%">
        <thead>
        <tr>
            <td colspan="5" class="controls">
                Search <input type="text" value="" class="search_field"/>
            </td>
        </tr>
        <tr>
            <th class="id_sort">ID</th>
            <th class="name_sort">Name</th>
            <th class="basis_sort">Basis</th>
            <th class="type_sort">Type </th>
            <th>&nbsp;</th>
        </tr>
        </thead>
        <tbody>
          {{#each Skills.skills}}
          <tr>
            <td>
                {{id}}
            </td>
            <td>{{name}}</td>
            <td>{{basis}}</td>
            <td>{{type}}</td>
            <td class="control">
                <button class="edit"><span class="icon"></span> Edit</button>
            </td>
          </tr>
          {{/each }}
        </tbody>
        <tfoot>
        <tr>
            <th class="id_sort">ID</th>
            <th class="name_sort">Name</th>
            <th class="basis_sort">Basis</th>
            <th class="type_sort">Type </th>
            <th>&nbsp;</th>
        </tr>
        <tr>
            <td colspan="5" class="controls">
                <button class="add" {{action "add_skill"}} >Add Skill
                </button>
            </td>
        </tr>
        </tfoot>
    </table>
</script>

<script type="text/x-handlebars" >
    {{view Skills.SkillsView}}
</script>

<script language="javascript">

    var SKILLS;

    $(function () {
        Skills = Ember.Application.create({

            Skill: Ember.Object.extend({
                id: 0,
                name: '',
                basis: ''
            }),

            skills: [],

            add_skill: function(){
                console.log("adding a new skill");
            }

        });

        Skills.skills = [
            {name:"throwing", basis:"speed", type: 'skill', id:0},
            {name:"spech", basis:"will", type: 'skill', id:1}
        ].map(function(s){ return Skills.Skill.create(s); });

        Skills.SkillsView = Ember.View.extend({
            templateName:'skill-list',
            add_skill: function(){
                Skills.add_skill();
            }
        });

    })
</script>