Javascript 从Ember.View更新子视图

Javascript 从Ember.View更新子视图,javascript,ember.js,Javascript,Ember.js,我正在做一个带有服务器API调用的ajax表单。 服务器可以返回特定字段的错误消息(例如:url=>“此url不正确”) 因此,我为我的表单文本字段创建了一个特定视图: (textfield.handlebars) {{view Ember.TextField valueBinding="value"}} {{#if hasError}} <div class="error">{{errorMessage}}</div> {{/if}} (textfield.j

我正在做一个带有服务器API调用的ajax表单。 服务器可以返回特定字段的错误消息(例如:url=>“此url不正确”)

因此,我为我的表单文本字段创建了一个特定视图:

(textfield.handlebars)
{{view Ember.TextField valueBinding="value"}}
{{#if hasError}}
    <div class="error">{{errorMessage}}</div>
{{/if}}

(textfield.js)
App.TextField = Ember.View.extend({
    hasError: false,
    errorMessage: "",
    templateName:     "textfield",
});
(textfield.把手)
{{view Ember.TextField valueBinding=“value”}
{{{#如果hasError}}
{{errorMessage}}
{{/if}
(textfield.js)
App.TextField=Ember.View.extend({
错误:错,
错误消息:“”,
templateName:“textfield”,
});
在我的表单视图模板中,我有:

(form.handlebars)
<div class="form-row">
    <div class="form-element"><div class="input-wrapper">{{view App.TextField valueBinding="skill.job"}}</div></div>
</div>

(new.js)
submit: function() {
    var skill = this.get("skill");

    skill.saveResource()
    .fail( function(e) {
        //how could I set the errorMessage in my App.TextField
    });
}
(形把手)
{{view App.TextField valueBinding=“skill.job”}
(new.js)
提交:函数(){
var skill=this.get(“skill”);
skill.saveResource()
.失败(功能(e){
//如何在App.TextField中设置错误消息
});
}
当用户单击submit按钮时,我将所有表单数据发送到服务器并检索错误消息


我的问题是如何更新“subview”App.text字段以设置错误消息?

在form.handlebar上手动为其设置id(这样它将覆盖ember自动生成的id):


在form.handlebar上手动为其设置id(因此它将覆盖ember自动生成的id):


您可以使用保存错误消息的自定义
App.Error
对象。此外,如果您计划使用余烬数据,还将讨论验证问题。优秀的Ember.js插件中有一个验证扩展:

以下是我的想法,请看:

把手


名称:{{view App.TextField valueBinding=“content.name”propertyName=“name”}
年龄:{{view App.TextField valueBinding=“content.age”propertyName=“age”}
拯救 ​
JavaScript

App.Error=Ember.Object.extend({
isError:函数(propertyName){
return!Ember.empty(this.getErrorMessage(propertyName));
},
getErrorMessage:函数(propertyName){
返回此.get(propertyName);
}
});
App.ErrorMixin=Ember.Mixin.create({
classNameBindings:['iError:error'],
errorBinding:'parentView.error',
模板:Ember.handlebar.compile({{{if-isError}}{{errorMessage}}{{/if}}}),
isError:function(){
var error=this.get('error');
返回error&&error.isError(this.get('propertyName');
}.property('error','propertyName'),
errorMessage:函数(){
var error=this.get('error');
如果(错误){
var propertyName=this.get('propertyName');
返回错误。getErrorMessage(propertyName);
}
}.property('错误','属性名称')
});
App.TextField=Ember.TextField.extend(App.ErrorMixin);
然后,错误对象的构造如下所示:

Ember.View.create({
    templateName: 'edit',
    contentBinding: 'App.obj',
    save: function() {
        var content = this.get('content');
        var error = this.get('error');
        if (error) {
            error.destroy();
        }

        error = App.Error.create();

        if (content.get('age') <= 100) {
            error.set('age', 'sorry, you are not wise enough');
        }

        if ('Chuck Norris' === content.get('name')) {
            error.set('name', 'yeah, and i am the queen of england');
        }

        this.set('error', error);
    }
}).append();​
Ember.View.create({
templateName:“编辑”,
contentBinding:'App.obj',
保存:函数(){
var content=this.get('content');
var error=this.get('error');
如果(错误){
error.destroy();
}
error=App.error.create();

如果(content.get('age')您可以使用一个保存错误消息的自定义
App.Error
对象。此外,如果您计划使用ember数据,则会讨论验证问题。优秀的ember.js插件中有一个验证扩展:

以下是我的想法,请看:

把手


名称:{{view App.TextField valueBinding=“content.name”propertyName=“name”}
年龄:{{view App.TextField valueBinding=“content.age”propertyName=“age”}
拯救 ​
JavaScript

App.Error=Ember.Object.extend({
isError:函数(propertyName){
return!Ember.empty(this.getErrorMessage(propertyName));
},
getErrorMessage:函数(propertyName){
返回此.get(propertyName);
}
});
App.ErrorMixin=Ember.Mixin.create({
classNameBindings:['iError:error'],
errorBinding:'parentView.error',
模板:Ember.handlebar.compile({{{if-isError}}{{errorMessage}}{{/if}}}),
isError:function(){
var error=this.get('error');
返回error&&error.isError(this.get('propertyName');
}.property('error','propertyName'),
errorMessage:函数(){
var error=this.get('error');
如果(错误){
var propertyName=this.get('propertyName');
返回错误。getErrorMessage(propertyName);
}
}.property('错误','属性名称')
});
App.TextField=Ember.TextField.extend(App.ErrorMixin);
然后,错误对象的构造如下所示:

Ember.View.create({
    templateName: 'edit',
    contentBinding: 'App.obj',
    save: function() {
        var content = this.get('content');
        var error = this.get('error');
        if (error) {
            error.destroy();
        }

        error = App.Error.create();

        if (content.get('age') <= 100) {
            error.set('age', 'sorry, you are not wise enough');
        }

        if ('Chuck Norris' === content.get('name')) {
            error.set('name', 'yeah, and i am the queen of england');
        }

        this.set('error', error);
    }
}).append();​
Ember.View.create({
templateName:“编辑”,
contentBinding:'App.obj',
保存:函数(){
var content=this.get('content');
var error=this.get('error');
如果(错误){
error.destroy();
}
error=App.error.create();

如果(content.get('age')感谢您的快速回答!这很有效,但是如果我的表单很大(您可以添加/编辑以前的字段),我必须为每个字段生成一个id。没有简单的方法从Ember获取生成的id?(个人广告提醒)我计划在我自己的表单生成器库中添加这个。但是我没有时间这么做。谢谢你的快速回答!这很有效,但是如果我的表单非常大(你可以添加/编辑以前的字段),我必须为每个字段生成一个id。没有简单的方法从Ember获取生成的id?(个人广告提醒)我计划在我自己的FormBuilder库中添加这个,但我还没有时间这么做
Ember.View.create({
    templateName: 'edit',
    contentBinding: 'App.obj',
    save: function() {
        var content = this.get('content');
        var error = this.get('error');
        if (error) {
            error.destroy();
        }

        error = App.Error.create();

        if (content.get('age') <= 100) {
            error.set('age', 'sorry, you are not wise enough');
        }

        if ('Chuck Norris' === content.get('name')) {
            error.set('name', 'yeah, and i am the queen of england');
        }

        this.set('error', error);
    }
}).append();​