Firebase .push () Ошибка и ng-модель не работает

0

Я получаю эту ошибку:

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 пуст.

Что здесь происходит?

Теги:
firebase

3 ответа

2

Вы должны применить 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.

  • 0
    Да, ты прав. Я на самом деле загрузил неправильный код. Я только добавил ng-model к элементу label, потому что пытался выяснить ошибку. Первоначально он был на элементе ввода, и все еще получил ту же ошибку.
  • 0
    Вы правы в том, что itemsRef не указывает на массив. Вместо этого он указывает на объект Firebase , который определяет метод push .
1

Вы, кажется, не используете 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 должна иметь ценность, чтобы получить эту работу

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 счастлива :-)..

Ещё вопросы

Сообщество Overcoder
Наверх
Меню