【问题标题】:How can I use ng-model two-way binding with a function in AngularJS?如何在 AngularJS 中将 ng-model 双向绑定与函数一起使用?
【发布时间】:2014-12-28 09:36:42
【问题描述】:

因此,我为我的 Angular 应用程序提出了这种出色的数据模型方法,它可以让我做这样的花哨的事情:

var product = productModel.create();
product.set('name', 'Widget');
product.set('price', 12.99);
product.set('quantity', 46);
product.save().success(function() {
    alert('It saved!');
});

但后来我意识到...这不适用于 ng-model :(

<form>
    <div>
        <label>Name</label>
        <input type="text" ng-model="product.get('name')" />
    </div>
    <div>
        <label>Quantity</label>
        <input type="text" ng-model="product.get('quantity')" />
    </div>
    <div>
        <label>Price</label>
        <input type="text" ng-model="product.get('price')" />
    </div>

    <input type="submit" value="Save" />
</form>

当我在输入字段中输入文本时,我得到了这个

错误:[ngModel:nonassign] 表达式 'product.get('name')' 是 不可转让。元素:&lt;input type="text" ng-model="product.get('name')" class="ng-pristine ng-untouched ng-valid"&gt;

很明显,这是因为 Angular 想要绑定一个变量,但我却试图绑定一个函数调用。

我真的很想保留这种使用 get() 和 set() 的模型方法。我怎样才能使它与 ng-model 一起工作并且仍然具有双向绑定?一定有办法……

【问题讨论】:

标签: javascript angularjs data-binding model


【解决方案1】:
//when creating the {get: ..., set: ...} object, also add this method:
product.bind = function(key) {
  var obj = this
  return function(val) {
    if (angular.isDefined(val)) {
      obj.set(key, val)
    }
    return obj.get(key)
  }
}

然后在 HTML 中:

<form ng-model-options="{getterSetter: true}">
  <input ng-model="product.bind('name')">
</form>

http://plnkr.co/edit/1GyWhswyO43R6nm49hHP?p=preview

【讨论】:

  • 哇,伙计,太棒了。你应该为此获得很多分数。这正是我一直在寻找的。在函数内部返回一个函数非常棒。
  • 我发现的一件事是:对于使用绑定的表单,在 ng-model-options 中将 allowInvalid 设置为 true 可能是个好主意。否则,如果每次击键都会产生有效的模型值,则文本字段不会随着每次击键而更新——尤其是当您在表单中使用 ng-pattern 验证时。我正在使用:ng-model-options="{getterSetter: true, allowInvalid: true}".
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2016-04-19
  • 2014-10-19
  • 2016-07-29
  • 1970-01-01
  • 1970-01-01
  • 2017-01-11
相关资源
最近更新 更多