Как сделать MVVM с помощью KnockoutJs в упакованном приложении Chrome? он не позволяет встроенный JS в html

Теперь я использую KnockoutJs и хочу разработать пакетное приложение для Chrome. Мне интересно, как связать данные MVVM. Потому что в http://developer.chrome.com сказано, что нельзя использовать встроенный javascript в html. JS должен быть отдельным файлом.

Итак, как я могу написать, что MVVM работает для клика? и или тем более с нокаутом?

<span data-bind="text : $data.name, click : $root.load> </span>
<span data-bind="text:shoppingCart().somethingChange()"></span>

comment
Вы действительно можете использовать Knockout.js. Ответ с самым высоким рейтингом не является окончательным решением. Я напишу, как я исправил проблему для своего расширения.   -  person AlexStack    schedule 06.04.2015
comment
@AlexStack Неверно (ваше решение работает для расширений, но не для приложений)   -  person Xan    schedule 06.04.2015
comment
Один из вариантов — мой плагин: github.com/brianmhunt/knockout-secure-binding — Некоторые люди сообщают об успешном использовании пакетных приложений Chrome.   -  person Brian M. Hunt    schedule 17.03.2016


Ответы (4)


Быстрая версия

Вы не сможете использовать его, если не запустите страницу в песочнице и не удалите определенные функции.


Длинная версия

Пакетные приложения Chrome требуют, чтобы код и все используемые библиотеки были совместимы с CSP. Другими словами, нельзя использовать eval(), new Function(), любой HTML-тег <script></script> и некоторые другие вещи.

Knockout использует некоторые из них для привязок и для шаблонов. Поэтому вы не можете использовать Knockout для упакованных приложений Chrome.

Кроме того, я нашел некоторую информацию, указывающую на то, что разработчики Knockout не стремятся сделать его совместимым с CSP. Вы можете найти это в их репозитории Git.

Есть несколько очень похожих проблем с расширениями Chrome. То, что я читал на эту тему, касалось песочницы iframe... Немного больше копания, песочница приведет к тому, что страница не сможет использовать определенные функции.

Единственная альтернатива — использовать настраиваемый поставщик привязки для Knockout. Тем не менее, я считаю более убедительным использовать другую библиотеку MV* в этот момент.

person Alerty    schedule 11.09.2013

насколько я знаю это

Вы не сможете использовать его, если не запустите страницу в песочнице и не удалите определенные функции.

Больше не держит.

Пока вы добавляете:

"content_security_policy": "script-src 'self' 'unsafe-eval'; object-src 'self'",

На корневой уровень manifest.json.

Я только что попробовал это с помощью простого: <h1 data-bind="text: version().length"></h1>

на странице default_popup и не обнаружил проблем с ней, по крайней мере, для Chrome в его версии: 48.0.2564.116 (64-битная)

person João Antunes    schedule 07.03.2016
comment
Downvote: вопрос касается приложений Chrome. Приложения Chrome не могут переопределять CSP, как это делают расширения. - person Xan; 08.03.2016
comment
Чтобы помочь нуждающимся, этот ответ работает для расширений Chrome. А вот про хром приложения не знаю. - person SOUPTIK BANERJEE; 17.05.2018

Похоже, вы пытаетесь связать текст, а не действие (например, «щелчок»), поэтому проще всего добавить computed observable для вашей модели, вычислите значение, которое вам нужно в его функции, и привяжите его к диапазону.

person Traveling Tech Guy    schedule 14.08.2013

Привязка данных Knockout не использует встроенный javascript в html, атрибут привязки данных HTML просто определяет строковое выражение, которое может содержать выражения, подобные javascript, которые нокаут будет анализировать и выполнять из своего внешнего файла сценария. У вас не должно возникнуть проблем с привязкой данных к нокауту MVVM.

person Eriedor    schedule 16.08.2013
comment
Ложь.. это не совместимо с CSP. :( - person Alerty; 11.09.2013