Есть вот такой объект, из которого берет данные vue для отрисовки. Понадобилось хранить строковые представления кусочков кода (условий) в нем. Я знаю, все про риски, но так нужно. В какой-то момент эти условия надо проверить, как это сделать? Контекст для eval по умолчанию window, как ему подсунуть то, что лежит в obj.vars?
var obj = {
vars : {
a: 5,
b: 6,
c: false
},
/*еще много всего*/
blocks: [
{
condition: "a<b",
text: "foo"
},
{
condition: "!c && a>3",
text: "bar"
}
]
};
var app = new Vue({
el: "#app",
data: {
blocks: obj.blocks,
vars: obj.vars
},
methods: {
check: function(cond) {
if (cond=="") return true; /*своя логика тоже должна быть*/
let result = true;
/*result = eval(cond) ?? */
return result;
}
}
});
<script src="https://cdnjs.cloudflare.com/ajax/libs/vue/2.5.17/vue.js"></script>
<div id="app">
<p v-for="block in blocks" v-if="check(block.condition)">{{block.text}}</p>
</div>
Можно obj.vars записать в другом виде, если это поможет, например:
[{key:"a", value:5},{key:"b", value:6...]
Или в виде ассоциативного массива.
Отказ от ответственности. Вам не следует применять данный код на продакшене.
Это далеко не лучшее решение, есть все еще тысяча и один способ сломать этот код, он имеет давольно примитивную защиту (не может обращаться к глобальному scope или к DOM), но все еще можно устроить утечку памяти или получить доступ к URL или к хранилищам (IndexDB, LocalStorage, SessionStorage).
В самом крайнем случае, если код Вы получаете от доверенного источника и уверены в безопасности его исполнения, то Вы должны использовать HTTPS, что бы условия не могли быть подделаны атакой человек посередине
var obj = {
vars : {
a: 5,
b: 6,
c: false
},
/*еще много всего*/
blocks: [
{
condition: "a<b",
text: "foo"
},
{
condition: "!c && a>3",
text: "bar"
}
]
};
function runTrustedCode (variables = {}, code) {
for (let name of Object.keys(variables)) {
let regexp = new RegExp(`${name}`, 'g');
code = code.replace(regexp, `this.${name}`)
}
return Function(`"use strict";const window=null;const document=null; return(${ code })`).call(variables);
}
console.log(runTrustedCode(obj.vars, obj.blocks[1].condition))
Айфон мало держит заряд, разбираемся с проблемой вместе с AppLab
Мне нужно в ангуляр выводить дату которую я записал в БД как параметрЯ вывожу но в таком виде:
Подскажите, пожалуйста, почему после добавления новых инпутов, значения в старых пропадаютИ как это можно будет исправить? Заранее спасибо...