如何在不立即触发验证的情况下绑定模型 属性(来自控制器)?

How to bind a model property (from controller) without it firing validation right away?

我有一个简单的模型支持控制器,对全名进行简单验证。我将验证添加到模型错误计算 属性 中,如下所示。它工作得很好,除了这个计算的 属性 是 "fired" 立即在呈现表单时显示 "please enter a username" 错误。

问题是-如何应该我这样做是为了获得很好的计算property/2数据绑定方式属性和错误消息但是......不会立即触发(而是等待用户先输入内容)。

var UserController = Ember.Controller.extend({
    actions: {
        submit: function() {
            //verify model is legit ... transitionToRoute if so
        }
    }
});

var User = Ember.Object.extend({
    enteredUsername: "",
    username: function() {
        var enteredUsername = this.get("enteredUsername");
        return enteredUsername.trim();
    }.property("enteredUsername"),
    usernameError: function() {
        var username = this.get("username");
        if (!username) {
            return "please enter a username";
        }
    }.property("username")
});

{{input type="text" value=model.enteredUsername}}
<span class="input-error">{{model.usernameError}}</span>

正如@Sisir 所说,您可能需要某种变量来检查模型值是否脏。这是实现它的一种方法。基本上,模型 属性 将由 valueisDirty 属性 组成。所以 enteredUsername 将是

enteredUsername: {
  value: '',
  isDirty: false
}

您修改后的代码将如下所示

var User = Ember.Object.extend({
  enteredUsername: {
    value: '',
    isDirty: false
  },

  username: function() {
    var value = this.get("enteredUsername.value").trim();

    //Once dirty is set, then dont reset.
    if(!this.get('enteredUsername.isDirty')) {
        this.set('enteredUsername.isDirty', value.length > 0);
    }

    return value;
  }.property('enteredUsername.value'),

  usernameError: function() {
    var username = this.get("username");
    var isDirty = this.get('enteredUsername.isDirty');
    if (!username && isDirty) {
      return "please enter a username";
    }
  }.property('username', 'enteredUsername.isDirty')
});

Here is a working demo.