Вы можете убедиться, что обещание заканчивается, прежде чем назначать продукты в контроллере и не запускать fetchAll
несколько раз. Вы можете изменить службу:
serv.factory('shopService', function($q) {
//create the shop client as service varible
var client = window.ShopifyBuy.buildClient({
domain: 'xxxxxxx.myshopify.com',
storefrontAccessToken: 'xxxxxxxxxxxxxxxxx'
});
var products = [];
var fetchAllCompleted = false;
function getProducts() {
var deferred = $q.defer();
if (fetchAllCompleted) {
deferred.resolve(products);
} else {
client.product.fetchAll().then((products_complete) => {
//do things and get the products ready
products.push(item);
fetchAllCompleted = true;
deferred.resolve(products);
});
}
return deferred.promise;
}
return {
getProducts: getProducts
}
});
Затем в контроллере
serviceApp.controller('CartController', ['shopService', function CartController(shopService) {
//create a reference to the service variable
shopService.getProducts().then(function(products) {
this.products = products;
});
}]);
Это должно устранить ваши проблемы.
Используя jquery, вы можете сделать что-то вроде этого:
$(document).ready(function(){
$('.updateButton').prop('disabled',true);
$('#inputFeild').keyup(function(){
$('.updateButton').prop('disabled', this.value == "" ? true : false);
})
});
сначала вы отключаете кнопку, при каждом нажатии клавиши проверяете, вводил ли пользователь что-либо, затем активировали кнопку обновления, если это необходимо.
Я обнаружил, что эта проблема не связана с тем, когда запускается сама функция. Проблема заключается в том, что элементы DOM устанавливаются в мою переменную внутри функции, когда пользователь вводит в поле, а не когда функция вызывается на самом деле.