属性更改时重新呈现视图

时间:2014-04-04 09:32:57

标签: ember.js

每当设置active属性时,我都有以下视图来显示选中的标记:

App.ActiveEntryView = Ember.View.extend({

    render: function(buffer) {
        var active = this.get('active'), icon;
        if (active) {
            icon = 'fa fa-check';
        } else {
            icon = '';
        }
        return buffer.push(icon);
    }

});

但如果active属性发生变化,则不会重新渲染。这在我的模板中绑定如下:

{{#each model}}
    <tr class="odd-even">
        ....
        <td>{{view App.ActiveEntryView activeBinding="parked"}}</td>
        ....
    </tr>
{{/each}}

其中parked是我要评估的模型的属性。但是,只要该属性在模型中发生更改,就不会重新呈现视图。我试过添加一个观察者:

App.ActiveEntryView = Ember.View.extend({

    render: function(buffer) {
        var active = this.get('active'), icon;
        if (active) {
            icon = 'fa fa-check';
        } else {
            icon = '';
        }
        return buffer.push(icon);
    }.observes('active')

});

但后来我收到了一个错误:

Uncaught TypeError: undefined is not a function

参考这一行:

        return buffer.push(icon);

我猜观察者会触发渲染函数传递的参数不同于buffer

如何重新渲染视图呢?

1 个答案:

答案 0 :(得分:0)

我对视图知之甚少,但据我所知,这不是重新渲染的方法。具体来说,render是系统在需要呈现模板时调用的钩子。自己调用钩子不会强制系统重新渲染模板,这必须在更高级别完成。

话虽如此,可能有一种方法可以强制重新渲染整个视图,但对于大多数问题而言,这似乎不是一个好的解决方案。我看到你正在用图标做一些事情,所以我会在不知道你的整个问题的情况下采取疯狂的方法。如果您发布更多详细信息,我可能会帮助您更多。

据我所知,当active属性发生变化时,您似乎正在尝试更改视图中元素的图标。以下是您可以这样做的方式:

在您的视图模板中:

<i {{bind-attr class='view.active:fa view.active:fa-check'}}></i>

您可以查看有关绑定类名here的更多详细信息。