Я получаю эту ошибку:
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 пуст.
Что здесь происходит?
Вы должны применить ng-модель для input
label
.
<input ng-model="price" type="text" placeholder="$200.00" >
вместо
<label ng-model="price" class="item item-input item-stacked-label">
И в вашем коде вы создали object
класса ie itemsRef
. Его object
не array
. Поэтому из-за этой строки itemsRef.push({'price':itemprice});
вы получаете ошибку. push
для arrays
не для object
.
Вы, кажется, не используете angularJS в полном объеме.
Как уже упоминалось в другом ответе, вы должны установить ng-модель на элемент ввода, а не на метку, потому что тогда вы можете использовать философию angularJS двусторонней привязки данных.
Это связано с тем, что пользователь может взаимодействовать с вашим клиентским приложением в angularJS и может только изменять значение элементов HTML, которые можно редактировать.
Таким образом, эти значения являются ng-моделью и привязываются к вашему контроллеру и отображаются через клей под названием $ 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
) с некоторым значением для проверки.
UPDATE: ваш код $scope.itemsRef.push({'price': $scope.price});
для сохранения в Firebase абсолютно правильно, что Firebase не нравится неопределенным в javascript, поэтому ваша модель $ scope.price должна иметь ценность, чтобы получить эту работу
Поскольку 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 счастлива :-)..
itemsRef
не указывает на массив. Вместо этого он указывает на объектFirebase
, который определяет методpush
.