Custom Upload ảnh trong simplemde-markdown-editor
Bạn có thể đặt một thẻ <input type="file" style="display:none"/>
vào trong form. Sau đó, ở trong callback action:
const inputFile = document.querySelector('#hidden-input-file');
...
{
name: "image",
action: () => inputFile.click()
}
Tại sao lại là Vuejs
Trước hết bạn nên phân biệt jQuery chỉ là một bộ thư viện javascript hỗ trợ trong quá trình code trong khi Vue.js thì là một framework (bao gồm rất nhiều thành phần con như: router, view), tuy nhiên, mặc định Vue chỉ đóng vai trò render View để hiển thị, các thành phần con này được tách biết hoàn toàn, nếu bạn cần dùng thì bạn cài thêm vào. Các view được phân tách thành các Component của bạn, tạo giao diện nhanh chóng, đơn giản, dễ đọc hiểu hơn là jQuery.
- Nói về jQuery, nó là một bộ thư viện javascript có cái thời mà các chuẩn ES5, ES6 đang phổ dụng ở hiện tại còn chưa ra đời. Khi mà jQuery chưa ra đời, để viết một hiệu ứng khi cuộn trang, cuộn về đầu trang hay gì đó ta phải viết cả nghìn dòng code. jQuery tập hợp rất nhiều các function hữu ích, giúp code gọn gàng hơn, giúp mọi người viết ít code hơn mà vẫn làm được các chức năng. Ngay cơ bản là select một element trong DOM dùng Javascript thuần, nó đã dài gấp đôi so với dùng jQuery, chưa nói đến các function làm chức năng khác phức tạp hơn.
// Javascript:
var element = document.getElementById('kim')
// jQuery:
var element = $('#kim')
jQuery như là một con đường tắt vào bấy giờ, bởi thế nên thời đấy (cũng phải 10 năm về trước) jQuery rất thông dụng. Và có rất nhiều các plugin được viết để tích hợp với jQuery, nhất là cách thư viện làm hiệu ứng cho website.
- Tới thời điểm hiện tại, jQuery vẫn được dùng rất rộng rãi , tuy nhiên, từ khi Node.js ra đời, mọi thứ đang dần thay đổi, khi mà các thư viện javascipt nhỏ gọn thực hiện cho các mục đích cụ thể xuất hiện rất nhiều và quản lý đơn giản qua NPM. Giúp bạn chỉ dùng những thứ bạn cần, thay vì một bộ javascript đồ sộ từ jQuery. VD như Vue.js, nó là framework giúp bạn làm ra các ứng dụng web. Mã nguồn khi viết dễ đọc hiểu, Vue quản lý các view trên virtual DOM được phân tách thành các component giúp bạn dễ dàng quản lý, thao tác, tái sử dụng. Nhưng thứ nhỏ lẻ khác bạn cần, có thể tìm các library nhỏ bé khác để dùng thay vì cài jQuery, rồi lại cài thêm một thự viện khác viết cho jQuery. Mọi thứ lúc đấy bạn sẽ thấy bị phụ thuộc quá nhiều với jQuery.
CSS trong Reactjs
Tận dụng các mức mức ưu tiên của CSS để custom style. Mình khuyên bạn là viết các class input khác của riêng bạn để ghi đè lại css cho bất cứ thư viện nào thay vì viết cho class cùng tên của thư viện. Như thế sẽ làm thay đổi tất cả những chỗ khác. Trừ khi bạn chấp nhận thế.
Nếu thư viện bạn dùng có hỗ trợ SASS, LESS, STYLUS, thì việc custom lại một số thứ như màu theme, font, border.. có thể đơn giản hơn vì thường nó sẽ gán vào các biến chung. Nhưng một số khác cũng nên sử dụng class mình khai báo để ghi đè.
V/v lấy dữ liệu và trộn lại trong MySql
Anh nghĩ em tạo một bảng lưu nhật ký hoạt động riêng, mỗi row tương ướng với một hành động mà người dùng đã thực hiện. Có user_id làm foreign key để tham chiếu với bảng users.
Khi lấy dữ liệu từ nhiều bảng thì em dùng các mệnh đề join của mysql hoặc có thể liệt kê các bảng trong mệnh đề from.
Thường các bảng có quan hệ với nhau chúng ta dùng mệnh đề join. Và trong một các bảng đấy nếu có cột trùng tên thì trong mệnh đề where, order... e phải chỉ rõ tên bảng chứa cột đấy.
VD:
Select title, name, department_name
From employees, departments
Order by employees.created_at Desc
Tạo function với dynamic parameter trong PHP
Mình nghĩ nếu thay đổi, bạn có thể pass thẳng $row
cho Obj, đồng thời sửa lại Obj constructor:
while ($row = mysqli_fetch_assoc($data)) {
array_push($arrayData, new Obj($row));
}
Nhờ mọi người giải thích giúp mình ý nghĩa của dòng lệnh này trong JavaScript
Đoạn này cũng dễ hiểu mà, đơn giản là nó tạo ra một chuỗi ký tự ngẫu nhiên có độ dài 16 ký tự, theo quy tắc:
- Tạo ra 4 chuỗi
s4
- Để tạo ra chuỗi 4 ký tự: Tạo ra một số ngẫu nhiên, rồi +1 đơn vị.
- Tiếp theo, nhân số đấy với 2^16 = 65,536 = 0x10000 (hexa).
- Làm tròn tích thành số nguyên rồi chuyền về dạng hexa string:
toString(16)
. Do 2^16 hệ hexa là 10000, có 5 ký tự nên tích của một số với 10000 chắc chắn có hơn 5 ký tự, sau khi chuyển về hexa, cắt bỏ ký tự đầu tiên.
- Nối 4 chuỗi ở bước 1 với nhau để tạo ra chuỗi 16 ký tự.
V/v trỏ domain *.me (namecheap) về hosting của hostinger.vn
Đơn giản lắm, bạn trỏ bằng nameservers hoặc dùng IP address cho nhanh. Bằng cách đổi nameservers của domain thành namesevers của Hostinger
.
Cách 1: IP Address
- Đăng nhập hosting, nó sẽ có một cái IP tương ứng với hosting đấy. Copy IP đấy.
- Đăng nhập domain control panel, vào phần DNS, bạn tạo record với
type
là A,value
là IP của hosting, tls bạn chỉnh về 0 hoặc không chỉnh được về 0 thì chọn số nhỏ nhất.
Cách 2: Dùng nameservers
Cụ thể:
- Đăng nhập hosting, xem thông tin và copy nameservers, nó có dạng:
ns1.hostinger.vn
ns2.hostinger.vn
ns3.hostinger.vn
- Đăng nhập domain control panel, có phần cấu hình DNS. Bạn vào đó rồi đổi nameservers thành
ns1.hostinger.vn
.
Chi tiết: https://www.hostinger.vn/huong-dan/cach-tro-ten-mien-ve-host-hostinger/
Giúp đỡ cách tạo file.js trong router và khai báo ở app.js như thế nào ??
Sao 3 routes của bạn lại "dùng chung" một adminRouter
thế kia? Mình nghĩ bạn làm như này sẽ gọn gàng hơn, giả định ở đây mình dùng Express:
/** app.js **/
const adminRouter = require('./routes/admin')
app.use('/admincp', adminRouter)
/** admin.js **/
const router = express.Router()
router.get('login', ...)
router.get('signup', ...)
...
// Nếu số lượng route ở đây nhiều, có thể gom nhóm các route liên quan rồi tách ra một file khác.
// Ví dụ: gom nhóm bọn route cho accounts module vào một file accounts.js
const accountsModuleRouter = require('./accounts')
router.use('accounts', accountsModuleRouter)
// Hoặc đơn giản chỉ là: router.use(accountsModuleRouter)
module.exports = router
lỗi Call to undefined method MongoClient::selectDatabase()
Mình tưởng là thế này chứ nhỉ:
$client = new \MongoDB\Client()
$database = $client->selectDatabase('test')
Website ngày nào cũng bị chết tầm 3,5 phút . Nhờ các bác trợ giúp
- Bạn thử kiểm tra trên server xem có cronjob nào chạy cố định vào thời điểm đấy ko hay ngoài thời điểm đấy có còn lúc nào bị chết không?
- Sau rồi mình nghĩ là nên check logs xem có thông báo lỗi gì không, server die thể nào cũng để lại logs.
- Kiểm tra logs của app, logs của nginx/apache...
Nhờ kiểm tra giúp mình xem độ trễ do đâu mà ra
Viblo có support nhúng codepen vào bài viết, question, answer nè bạn :
{@codepen: https://codepen.io/Hoangvan/pen/xzWjRj}
How to returns HTML from a custom parser function in Simplemde..
Mục Configuration trong documentation có ghi rõ này em:
placeholder: Custom placeholder that should be displayed
Trong example cũng đã có code sử dụng mẫu option này rồi mà.
Insert Font Awesome icon into SimpleMDE placeholder (Tip)
Dạ, e biết cái đó ạ, nhưng em không thêm được mấy cái font-awesome ấy a.
Cái placeholder đấy được render vào element .CodeMirror-placeholder
, em copy icon mà em muốn hiển thị vào string placeholder. Muốn cái icon đã copy hiển thị được, em add thêm font cho cái element CodeMirror-placeholder
:
.CodeMirror-placeholder {
font-family: Arial, FontAwesome !important; /* Add FontAwesome */
}
reactjs startkit chạy ở môi trường production load chậm
Mấy cái link kia chắc là bạn dùng browser-sync để run web ở development mode, như vậy thì hơm sao đâu bạn. Mà bạn có chắc là web đang chạy ở production mode và disable browser-sync hơm? Mình nghi bạn đang run web ở development mode cho production.
Tại sao Laravel ServiceProvider gọi phương thức $this->app->rebinding() "không tồn tại"?
@quynh001 Mình thật sự vẫn chưa hiểu được câu hỏi của bạn.
Thứ 1: Đúng là chỉ có thể gọi rebinding qua các instance của Illuminate\Foundation\Application
và Illuminate\Container\Container
vì chỉ 2 class này có method đấy. Và Illuminate\Foundation\Application
rõ ràng là extends từ Illuminate\Container\Container
mà Container lại có rebinding nên đương nhiên gọi được.
Thứ 2: Và trong ServerProvider gọi các method bind
, rebinding
là thông qua instance của Application
mà bạn nhỉ? Nếu trong ServiceProvider bạn gọi $this->rebinding
thì chắc chắn không được rồi vì nó làm gì có nhỉ?
Thứ 3: Là bạn đang bị nhầm lẫn một chút thì phải, ServiceProvider không phải là một instance của Application.
Sr bạn cái này mình đọc nhầm. Bạn nói đúng, ServiceProvider chứa app là instance của Application.
Thứ 4: Interface chỉ là một cái contract để diễn đạt rằng các instance của interface đấy sẽ thực hiện được những hành động gì (thông qua các method trong interface). Các lớp khác nhau có thể tương tác với chúng thông qua interface mà không cần biết triển khai các method ở mỗi class ra sao. Và chỉ các method mô tả đặc trưng của class như vậy thì bỏ vào interface. Còn các method râu ria phục vụ các việc khác thì không nên để vào để giữ các contract được sạch đẹp và thể hiện đúng mô tả đặc trưng của nó.
Trên đây là ý kiến của mình, mời bạn tham khảo.
Cần các anh giúp Close app trên notification
Bạn thử tham khảo link này xem: https://stackoverflow.com/questions/43058960/exit-application-after-click-on-android-notification
Intent intent = new Intent("close_app");
PendingIntent pIntent = PendingIntent.getBroadcast(this, (int)
System.currentTimeMillis(), intent, PendingIntent.FLAG_UPDATE_CURRENT);
.
.
.// build your notification
Then in your onCreate:
private BroadcastReceiver mReceiver;
mReceiver = new BroadcastReceiver() {
@Override
public void onReceive(Context context, Intent intent) {
Log.d("TAG" ,"onReceive ");
finish();
}
};
Then receive your action and register in your onCreate or onResume:
IntentFilter filter = new IntentFilter();
filter.addAction("close_app");
registerReceiver(mReceiver, filter);
Cho em hỏi cách quy đổi số
Không có sẵn hàm nào trong JS để format number như bạn nói. Bạn có thể viết một hàm format lại long number về dạng short number ở trên.
Bạn tham khảo function bên dưới:
function intToString (value) {
var suffixes = ["", "k", "m", "b","t"];
var suffixNum = Math.floor((""+value).length/3);
var shortValue = parseFloat((suffixNum != 0 ? (value / Math.pow(1000,suffixNum)) : value).toPrecision(2));
if (shortValue % 1 != 0) {
var shortNum = shortValue.toFixed(1);
}
return shortValue+suffixes[suffixNum];
}
Nếu bạn muốn format number ở nhiều dạng khác hơn thì có thể dùng package đã có như:
Hỏi về cách đặt tên file trong SASS
Tên file bắt đầu bằng _
là quy tắc thể hiện một partial
của SASS. Nếu bạn muốn import một phần của stylesheet vào main stylesheet của bạn, nhưng không muốn file đấy được compile thành một file css thì file đó chính là một partial
. Hãy đặt tên file đấy bắt đầu bằng ký tự _
.
Ngoài ra, một số tools giúp compile file SASS thành CSS sẽ ẩn đi những file partial
. Và bạn có thể đọc tham khảo documentation của SASS tại https://sass-lang.com/documentation nha. Đương nhiên là có luôn cả thông tin về partial chính thống trong đó rồi.
Update
Bình thường bạn chỉ định rõ một file main.scss
nên bạn thấy SASS bỏ qua các file râu ria và output là main.css
. Nhưng thay vào đó nếu bạn dùng một tool nào khác (gulp chẳng hạn) để compile hẳn một folder chứa nhiều file sass.
Khi đó những file css được tạo ra sẽ tương ứng với các file sass mà được đặt tên không bắt đầu bằng _
. Những file partial lúc này sẽ không được compile thành một file CSS tương ứng nữa.
Append không hiển thị source code HTML trong 'View Source Code'
Có vẻ bạn đang bị nhầm View Source Code
với Inspect - Dev tool
rồi! View source code
sẽ hiển thị mã nguồn gốc của trang hiện tại mà server đã trả về. Coi như là xem một file text thôi, không xử lý gì cả. Còn Inspect lên sẽ xem được nội dung hiện tại của trang web, sau khi đã chạy cả code javascript.
Để kiểm tra đã append được chưa, bạn có thể xem ngay trên view của web hoặc xem trong Inspect Elements DevTool. Nếu bật DevTool lên mà thấy append được code vào rồi thì là bạn đã làm thành công rồi.
Share template thông qua API
Mình nghĩ là không nên lấy template qua API như vậy. Bạn có thể tách template dùng chung giữa nhiều dự án ra một Git Repository khác, bên project kia nếu muốn dùng thì mình dùng git clone về rồi thêm vào.
Nếu là bên PHP, mình có Composer, mình sẽ tách ra thành một package riêng cho template này. Và sang project khác thì mình dùng Composer để cài thêm package template vào. Composer hoạt động cũng giống như NPM của NodeJS ý bạn. Không biết là bên Rails có thành phần nào tương tự như Composer không.
Thắc mắc về Jquery Promise
Mình chưa hiểu vấn đề của bạn, tức là bạn muốn hiểu về Promise trong javascript hay là chưa biết cách giải quyết cho việc hiển thị dữ liệu tổng hợp ra màn hình?
Còn về cách hiển thị dữ liệu được tổng hợp ra màn hình thì mình nghĩ bạn có thể tham khảo như sau:
async function layDuLieuTongHop () {
const firstData = await axios.get('api/first')
const secondData = await axios.get('api/second')
return tongHop(firstData, secondData)
}
layDuLieuTongHop()
.then(function(data) {
// Hiển thị data đã được tổng hợp ra màn hình.
})