Firebase .push()错误和ng-model无法正常工作

时间:2015-07-03 04:48:29

标签: angularjs firebase

我收到了这个错误:

Error: Firebase .push failed: first argument contains undefined property 'price'

这是我的控制者:

angular.module('starter')
.controller('EditPicsController', function($scope,$location,$state) {

    var itemsRef = new Firebase('https://myapp.firebaseio.com/items');
    var itemprice = this.price
    $scope.createItem = function(itemprice){
        console.log(itemprice);
        var newItemRef = itemsRef.push({'price':itemprice});
    };  
});

我的模板:

<form>
    <div class="list">
      <label ng-model="price" class="item item-input item-stacked-label">
        <span class="input-label">Price</span>
        <input type="text" placeholder="$200.00" >
      </label>
    </div>

    <button ng-click="createItem(price)" class='button button-dark'>
        test-additem
    </button>
</form>

我的console.log输出为空。

这里发生了什么?

3 个答案:

答案 0 :(得分:2)

您应该将ng-model应用于input而不是label

<input ng-model="price" type="text" placeholder="$200.00" >

而不是

<label ng-model="price" class="item item-input item-stacked-label">

在您的代码中,您创建了一个object类,即itemsRef。它是object而不是array。因此,由于此行itemsRef.push({'price':itemprice});,您会收到错误。 push适用于arrays而非object

答案 1 :(得分:1)

你似乎没有完全使用angularJS。

正如在另一个答案中所提到的,你应该在输入元素而不是标签上设置ng-model,因为这样你就可以利用双向数据绑定的angularJS哲学。

这是因为用户可以在angularJS中与客户端应用程序进行交互,并且只能更改可编辑的HTML元素的值。

因此,这些值是ng-model,并将绑定到您的控制器,并通过控制器中名为$ scope的胶水曝光。

所以你的HTML将是:

<form>
<div class="list">
  <label class="item item-input item-stacked-label">
    <span class="input-label">Price</span>
    <input ng-model="price" type="text" placeholder="$200.00" >
  </label>
</div>

<button ng-click="createItem()" class='button button-dark'>
    test-additem
</button>

你的控制器代码:

angular.module('starter')
.controller('EditPicsController', function($scope,$location,$state) {

    $scope.itemsRef = new Firebase('https://myapp.firebaseio.com/items');
    $scope.createItem = function(){
        var newItemRef = $scope.itemsRef.push({'price': $scope.price});
    };  
});

此外,如果您的$scope.price未定义,那么Firebase会抱怨,因为它不会允许您保存未定义的值,因此请设置一些表单验证或初始化ng-model($scope.price)并使用某些值测试。

更新:您保存到Firebase的代码$scope.itemsRef.push({'price': $scope.price});绝对正确,因为Firebase不喜欢在javascript中定义,因此您的模型$ scope.price需要有一个值来获取此值工作

答案 2 :(得分:0)

由于Firebase不喜欢这样的未定义属性:

item = { 'name': 'hot dog', 'price': undefined };
itemsRef.push(item);

在推送

之前,我会对物体进行快速而脏的清理
for( let attr in item){
    try {
        if( item[attr] == undefined ) delete item[attr];
    } catch(e){}
}
itemsRef.push(item);

将推送

{ 'name': 'hot dog' }

和firebase很高兴:-) ..