【问题标题】:Ember.Select view complaining about value passedEmber.Select 视图抱怨传递的值
【发布时间】:2013-11-06 13:18:00
【问题描述】:

我有一个 Ember.js (1.0.0) 应用程序,我正在尝试为其实现内置的 Ember.Select 视图。

此应用程序显示三个任务列表:inProgresscompletedunassigned。用户可以过滤其相应项目显示的任务。这就是 Ember.Select 视图的用武之地。但是,当我加载路线时,Ember 对我咆哮着说我给它的值的类型:

Assertion failed: The value that #each loops over must be an Array. You passed projects.all

Uncaught TypeError: Object projects.all has no method 'addArrayObserver'

Uncaught Error: Something you did caused a view to re-render after it rendered but before it was inserted into the DOM.

我已经为此苦苦挣扎了几个小时,尝试了下面代码的不同排列 - 我知道我必须遗漏了一些明显的东西,因为它只是 不能很难让这么简单的组件正常工作。希望你们能指出我正确的方向。

这是我的路线:

Bee.TasksIndexRoute = Bee.Auth.Route.extend
    setupController: (ctrl) ->
        # get tasks
        Bee.Auth.send
            url: Bee.endpoint "/tasks"
        .done (tasks) -> 
            ctrl.set "tasks.all", tasks
        # get projects
        Bee.Auth.send
            url: Bee.endpoint "/projects"
        .done (projects) -> 
            ctrl.set "projects.owned", projects.owned
            ctrl.set "projects.participating", projects.participating
            ctrl.set "projects.all", projects.owned.concat projects.participating

这是我的控制器:

Bee.TasksIndexController = Ember.ObjectController.extend
    project: null
    content:
        tasks: 
            all: []
            inProgress: []
            completed: []
            unassgined: []
    projects: 
        all: []
        owned: []
        participating: []
    visible: (->
        ctrl = @
        # filter tasks here            
    ).property "project"

这是我的模板:

<script type="text/x-handlebars" id="tasks/index">
    <div class="center-pane">
        <div class="top_options">
            <div class="project_filter">
                <strong>Viewing: </strong>
                {{view Ember.Select
                   content=projects.all
                   optionValuePath='content._id'
                   optionLabelPath='content.title'
                   value=project
                   prompt='All Tasks'
                }}
            </div>
            <strong class="gold-gradient option_button">
                {{#link-to 'tasks.create' classNames='new_task'}}Create Task{{/link-to}}
            </strong>
        </div>
        <div class="col3">
            <div class="col-header in-progress light-gradient">
                <h3>In Progress</h3>
            </div>
            <div id="tasks_active_list">
                {{#if visible.inProgress.length}}
                    <ul>{{#each visible.inProgress}}{{view Bee.TaskListView}}{{/each}}</ul>
                {{else}}
                    <p class="no_projects">None</p>
                {{/if}}
            </div>
        </div>
        <div class="col3">
            <div class="col-header completed light-gradient">
                <h3>Completed</h3>
            </div>
            <div id="tasks_closed_list">
                {{#if visible.completed.length}}
                    <ul>{{#each visible.completed}}{{view Bee.TaskListView}}{{/each}}</ul>
                {{else}}
                    <p class="no_projects">None</p>
                {{/if}}
            </div>
        </div>
        <div class="col3">
            <div class="col-header unassigned light-gradient">
                <h3>Unassigned</h3>
            </div>
            <div id="tasks_unassigned_list">
                {{#if visible.unassigned.length}}
                    <ul>{{#each visible.unassigned}}{{view Bee.TaskListView}}{{/each}}</ul>
                {{else}}
                    <p class="no_projects">None</p>
                {{/if}}
            </div>
        </div>
    </div>
</script>

任何见解将不胜感激。我知道Ember.Select 是罪魁祸首,因为当我用简单的替换它时:

<select>
    {{#each projects.all}}
        <option value="{{_id}}">{{title}}</option>
    {{/each}}
</select>

...它渲染得很好-但是我需要使用Ember.Select,因此我可以将值绑定到TasksIndexController上的project属性-因为我将使用它作为触发@987654337的可观察值@函数。

【问题讨论】:

    标签: javascript ember.js coffeescript


    【解决方案1】:

    尝试将 projects.all 预先设置为 null。也许 ember select 与类上的 pojo 默认数组有问题。

    Bee.TasksIndexController = Ember.ObjectController.extend
      project: null
        content:
          tasks: 
            all: []
            inProgress: []
            completed: []
            unassgined: []
      projects: 
        all: null
        owned: []
        participating: []
      visible: (->
        ctrl = @
        # filter tasks here            
      ).property "project"
    
    
    
    setupController: (ctrl) ->
        # get tasks
        Bee.Auth.send
            url: Bee.endpoint "/tasks"
        .done (tasks) -> 
            ctrl.set "tasks.all", tasks
        # get projects
        Bee.Auth.send
            url: Bee.endpoint "/projects"
        .done (projects) -> 
            ctrl.set "projects.owned", projects.owned
            ctrl.set "projects.participating", projects.participating
            ctrl.set "projects.all", projects.owned.concat projects.participating
    

    这是一个简化的例子:http://emberjs.jsbin.com/aletIyU/3/edit

    【讨论】:

    • [] 更改为 null 似乎没有什么不同,但是在查看 JSBin 示例后,我发现它使用的是 Ember 1.1.1 - 所以我更新了我的 1.0。 0 构建到最新的 1.1.2,一切都按我的预期工作。多么痛苦!感谢您间接回答!
    • 感谢@sp0rkyd0rky!这让我发疯了!我最初从 1.1.1 开始,但使用了一段时间的金丝雀版本来测试一些功能。我最近回到 1.1.1 并得到了这个错误。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2016-01-08
    • 2020-02-22
    • 1970-01-01
    • 2014-02-18
    • 1970-01-01
    • 2014-02-09
    • 2022-01-10
    相关资源
    最近更新 更多