我收到了这个错误:
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输出为空。
这里发生了什么?
答案 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很高兴:-) ..