1

我有这个代码供查看:

App.TodoView = Em.View.extend({
    labelView: Em.TextField.extend({

    }),
    createNew:function () {
        console.log(this.labelView.get('value'));
    }
});

这个模板:

{{#view App.TodoView}}    
    {{view labelView}}    
    {{#view Em.Button target="parentView" action="createNew"}}Add{{/view}}    
{{/view}}

我收到以下错误:

Uncaught TypeError: Object (subclass of Ember.TextField) has no method 'get'

我也想使用 insertNewLine 方法,所以我可以设置Em.TextFieldin 模板的值。

4

1 回答 1

4

问题是您正在定义一个类并试图从中获取value。您更想要的是获得value一个具体实例。这可以通过将 的 绑定valueLabelView一个值来实现,然后可以在 中检索该值App.TodoView,在这种情况下todoLabel,请参阅http://jsfiddle.net/pangratz666/PTPsV/

车把

{{#view App.TodoView }}
    <!-- Bind the value of the LabelView to todoLabel on the App.TodoView -->
    {{view LabelView valueBinding="todoLabel" }}
    {{#view Em.Button target="parentView" action="createNew" }}Add{{/view}}
{{/view}}

JavaScript

App.TodoView = Em.View.extend({
    LabelView: Em.TextField.extend(),

    createNew: function(){
        var value = this.get('todoLabel');
        console.log( 'le todoLabel', value );
    }
});​

请注意,由于您正在定义一个类LabelView,因此约定以大写形式编写,而实例则以小写形式编写。请参阅The Emberist的一篇关于命名约定的优秀博文。

此外,要访问 an 上的属性Ember.Object,您应该始终使用get,所以它是this.get('todoLabel')而不是this.todoLabel


您现在可以实现更多方法,例如insertNewlineand cancel- 注意 it'sinsertNewline和 not insertNewLine,请参阅text_support

结果将如下所示,请参阅http://jsfiddle.net/pangratz666/9ZLAC/

App.TodoView = Em.View.extend({
    LabelView: Em.TextField.extend({
        insertNewline: function(){
            this.get('parentView').createNew();
        },            
        cancel: function(){
            this.set('value', '');
        }
    }),

    createNew: function(){
        var value = this.get('todoLabel');
        console.log( 'le todoLabel', value );
    }
});​
于 2012-04-21T12:10:40.067 回答