Lãng Tử

Slick slider bị lỗi
Lãng Tử đã trả lời

bạn check lại những chỗ khởi tạo slide nhé, lỗi này có thể bạn khởi tạo slide nhiều lần cho chung 1 selector.



Lãng Tử

đã thích câu trả lời

.load, .unload, và .error, không được sử dụng từ bản jQuery 1.8. Thay vào đó là dùng .on() để đăng ký listeners.

Bạn thay code

$(window).load(function() { ... });

thành

$(window).on('load', function() { ... });













Lãng Tử

đã thích câu trả lời

Sau vài hôm tìm hiểu thì mình cũng tìm ra cách fix như sau. Hi vọng giúp được bạn nào đó cũng gặp phải trường hợp giống mình:

data() {
    return {
        sliders: []
    }
},

methods: {
    getSliders() {
        return new Promise((resolve, reject) => {
            axios.get('/api/get/slide-show').then(({data}) => {
                this.sliders = data.data
                resolve();
            }).catch(error => reject(error));
        });
    }
},

mounted() {
    this.getSliders().then(() => {
        $('.banner-slideshow').owlCarousel({
            autoplay: true,
            autoplayTimeout: 3000,
            autoplayHoverPause: true,
            loop: true,
            nav: true,
            items: 1,
            navText: ["<i class='icon-i-prev'></i>","<i class='icon-i-next'></i>"],
            lazyLoad: true,
            lazyLoadEager: 1
        });
    })
}

Ban đầu mình chỉ gọi khởi tạo slider sau khi lấy dược data:

axios.get('/api/get/slide-show').then(({data}) => {
            this.sliders = data.data
            //Khởi tạo slider ở đây
       });

Mình đoán có thể this.sliders chưa kịp nhận dữ liệu và vẽ lên DOM nên việc khởi tạo slider sẽ không có ý nghĩa gì khi chưa có các item trong html.

Việc bọc function lấy dữ liệu bằng 1 Promise khác sẽ đảm bảo chắc chắn là this.sliders của mình được gán giá trị, sau đó mình mới gọi function resolve.

Trong đó mới là nơi thích hợp để khởi tạo slider.


Lãng Tử

Slider owl Carousel không hoạt động khi để trong component của vuejs
Lãng Tử đã trả lời

Sau vài hôm tìm hiểu thì mình cũng tìm ra cách fix như sau. Hi vọng giúp được bạn nào đó cũng gặp phải trường hợp giống mình:

data() {
    return {
        sliders: []
    }
},

methods: {
    getSliders() {
        return new Promise((resolve, reject) => {
            axios.get('/api/get/slide-show').then(({data}) => {
                this.sliders = data.data
                resolve();
            }).catch(error => reject(error));
        });
    }
},

mounted() {
    this.getSliders().then(() => {
        $('.banner-slideshow').owlCarousel({
            autoplay: true,
            autoplayTimeout: 3000,
            autoplayHoverPause: true,
            loop: true,
            nav: true,
            items: 1,
            navText: ["<i class='icon-i-prev'></i>","<i class='icon-i-next'></i>"],
            lazyLoad: true,
            lazyLoadEager: 1
        });
    })
}

Ban đầu mình chỉ gọi khởi tạo slider sau khi lấy dược data:

axios.get('/api/get/slide-show').then(({data}) => {
            this.sliders = data.data
            //Khởi tạo slider ở đây
       });

Mình đoán có thể this.sliders chưa kịp nhận dữ liệu và vẽ lên DOM nên việc khởi tạo slider sẽ không có ý nghĩa gì khi chưa có các item trong html.

Việc bọc function lấy dữ liệu bằng 1 Promise khác sẽ đảm bảo chắc chắn là this.sliders của mình được gán giá trị, sau đó mình mới gọi function resolve.

Trong đó mới là nơi thích hợp để khởi tạo slider.



Lãng Tử

đã thích câu trả lời

Với magento 2 bạn có thể kiểm tra sản phẩm có phải là configurable hay không bằng cách sau:

if($product->getTypeId() == \Magento\ConfigurableProduct\Model\Product\Type\Configurable::TYPE_CODE){
          echo "đây là sản phẩm configurable";
}

Ở đây  $product đang là object của \Magento\Catalog\Model\Product 

Với magento 1 bạn có thể kiểm tra sản phẩm có phải là configurable hay không bằng cách sau:

if($product->getTypeId() == Mage_Catalog_Model_Product_Type_Configurable::TYPE_CODE){
          echo "đây là sản phẩm configurable";
}

Ở đây  $product đang là object của Mage_Catalog_Model_Product



Lãng Tử

đã thích câu trả lời

Vấn đề mấu chốt của bạn ở đây là khi bạn dùng v-model cho select nhưng biến được binding không chứa giá trị, như hiện tại mySelect của bạn đang được khởi tạo là mảng rỗng.

Khi bạn chọn một option, mySelect sẽ cập nhật giá trị của option bạn vừa chọn nên khi submit form, dữ liệu vẫn được gửi lên bình thường. Còn khi bạn edit thì có thể bạn load lại trang, giá trị của mySelect được khởi tạo lại là rỗng. Các option được đánh dấu là selected sẽ phụ thuộc vào giá trị của mySelect.

Bạn có thể làm theo 1 trong các cách sau:

  1. Khi load màn hình edit, bạn gán giá trị cho mySelect được lấy từ server trả về
  2. Không sử dụng v-model nữa. Trường hợp này nếu checkSelected của bạn trả về true thì option trên html sẽ show là selected.

Nếu chọn cách thứ 2 thì mySelect của bạn sẽ không tự nhận giá trị của option được chọn, ta phải làm bằng cách lấy giá trị được chọn sau event onChange, cụ thể như sau

onChange(event) {
    this.submitData = $(event.target).val(); //Giả sử bạn dùng jQuery và set global ký hiệu $ thay cho jQuery.
}

Giá trị của submitData mỗi khi thay đổi giá trị của option được chọn tương đương với việc vue js tự động binding giá trị qua v-model.







Lãng Tử

đã thích câu trả lời

Từ phiên bản 5.2 trở đi, nếu bạn dùng config:cache thì bạn chỉ có thể sử dụng hàm env trong file config.

Nếu muốn sử dụng ngoài phạm vi các file config thì bạn sử dụng hàm config thay vì sử dụng env.


Chi tiết tham khảo tại đây.





Lãng Tử

đã thích câu trả lời

Khi chọn selector: ".product-options-wrapper div" sẽ cho ra 3 div:


$(".product-options-wrapper div").length -> 3 items


Thay vì trỏ như trên, có thể sửa thành:

jQuery(".product-options-wrapper .fieldset div").each(function () {
    jQuery(this).on("click", function (e) {
        alert('ok');
    });
});

Lãng Tử

đã thích câu trả lời

Sau khi tìm hiểu một hồi thì mình đã tìm ra giải pháp:


Đối với MacOs:


  1. Mở MySQL từ System Preferences > Initialize Database >
  2. Gõ mật khẩu mới
  3. Chọn 'Use legacy password'
  4. Khởi động lại server.
  5. Kết nối lại bằng Sequel Pro