emberjs中渲染和视图关键字的区别?

时间:2014-04-17 14:02:02

标签: javascript templates ember.js views render

您何时会使用{{render "viewGoesHere" content}} vs {{view App.viewGoesHereView contentBinding="this"}}

我尝试动态更改要在侧栏菜单中的不同链接点击时呈现的模板。但是,只有在第一次点击链接(来自侧边栏)时,上述两种方法才会更改为正确的模板。之后点击的任何链接都会生成与第一次生成的模板相同的模板。

tl; dr:当点击侧栏中的不同链接时,我的模板不会动态更改。

以下是我的观点:

App.ViewGoesHereView = Ember.View.extend({
    templateName: function(){
        var templateName = 'baseTemplate';

        var value = this.get('controller.model.Name');

        if (Ember.compare(value, 'abc') === 0) {
            templateName = 'abcTemplate';
            return templateName;
        }

        else if (Ember.compare(value, 'xyz') === 0) {
            templateName = 'xyzTemplate';
            return templateName;
        }

        return templateName;

    }.property('controller.model.Name'),

});

我基本上是根据当前模型中的Name获取正确的模板,我可以在templateName变量中获取正确的名称,但它不会渲染。

2 个答案:

答案 0 :(得分:0)

我意识到,每次点击侧边栏的新链接时,value ('controller.model.Name')都不会更新。所以我插入了一个jquery函数来获取每次点击的更新名称,并将其分配给值变量。

App.ViewGoesHereView = Ember.View.extend({
    templateName: function(){
        var templateName = 'baseTemplate';

        var val = this.get('controller.model.Name');
        var value;

        $(document).ready(function () {
            $('li').click(function () {
                val = ($(this).text());
            });
        });

        value = val;

        if (Ember.compare(value, 'abc') === 0) {
            templateName = 'abcTemplate';
            return templateName;
        }

        else if (Ember.compare(value, 'xyz') === 0) {
            templateName = 'xyzTemplate';
            return templateName;
        }

        return templateName;

    }.property('controller.model.Name'),

});

答案 1 :(得分:0)

在您的代码示例中,您尝试将templateName属性连接到controller.model.Name这种方法第一次有效,正如您所说,但是templateName属性由ember视图首先使用只有时间。即,如果在呈现视图后templateName发生更改,则它不会重新呈现视图。如果您希望自己的方法有效,则每次依赖属性发生变化时都需要重新渲染视图。

//sample
App.ViewGoesHereView = Ember.View.extend({
    templateName: function(){
        var templateName = 'baseTemplate';

        var value = this.get('controller.model.Name');

        if (Ember.compare(value, 'abc') === 0) {
            templateName = 'abcTemplate';
            return templateName;
        }

        else if (Ember.compare(value, 'xyz') === 0) {
            templateName = 'xyzTemplate';
            return templateName;
        }

        return templateName;

    }.property('controller.model.Name'),
    //new property to re-render the view
    reRenderView: function () {
        this.rerender();
    }.observes('controller.model.Name')

});

注意:我没有测试过这段代码,因为我没有完整的用例。如果这不起作用,请回复。