2016-10-28 2 views
1

Hallo Ich habe eine Aurelia Web App mit der Aurelia CLI läuft.Aurelia mit knockout sicherer Bindung

Davor habe ich SystemJS als Modullader verwendet, aber da ich die Content-Security-Policy meiner App durchsetzen möchte, um "unsafe-eval" nicht zuzulassen, habe ich die Aurelia CLI wie vorgeschlagen in geändert this question.

Meine App ist eine ehemalige Durandal-App, die ich nach Aurelia umwandel, deshalb wird Knockout extensiv verwendet. Ich bin mit der aurelia-Knockout-Plugin

export function configure(aurelia) { 
    aurelia.use 
     .standardConfiguration() 
     .developmentLogging()   
     .plugin('aurelia-knockout'); 

    return aurelia.start().then(() => aurelia.setRoot()); 
} 

und ich habe sowohl den Knockout und die Ko-secure-Bindung npm Pakete installiert (wie Sie in meinem main.js sehen können) und konfigurierte sie in den aurelia.json Datei:

"dependencies": [ 
      "aurelia-binding", 
      "aurelia-bootstrapper", 
      "aurelia-dependency-injection", 
      "aurelia-event-aggregator", 
      "aurelia-framework", 
      "aurelia-history", 
      "aurelia-history-browser", 
      "aurelia-loader", 
      "aurelia-loader-default", 
      "aurelia-logging", 
      "aurelia-logging-console", 
      "aurelia-metadata", 
      "aurelia-pal", 
      "aurelia-pal-browser", 
      "aurelia-path", 
      "aurelia-polyfills", 
      "aurelia-route-recognizer", 
      "aurelia-router", 
      "aurelia-task-queue", 
      "aurelia-templating", 
      "aurelia-templating-binding", 
      { 
      "name": "text", 
      "path": "../scripts/lib/text" 
      }, 
      { 
      "name": "aurelia-templating-resources", 
      "path": "../node_modules/aurelia-templating-resources/dist/amd", 
      "main": "aurelia-templating-resources" 
      }, 
      { 
      "name": "aurelia-templating-router", 
      "path": "../node_modules/aurelia-templating-router/dist/amd", 
      "main": "aurelia-templating-router" 
      }, 
      { 
      "name": "aurelia-knockout", 
      "path": "../node_modules/aurelia-knockout/dist/amd", 
      "main": "aurelia-knockout" 
      }, 
      { 
      "name": "knockout", 
      "path": "../node_modules/knockout/build/output", 
      "main": "knockout-latest" 
      }, 
      { 
      "name": "knockout-secure-binding", 
      "path": "../node_modules/knockout-secure-binding/dist", 
      "main": "knockout-secure-binding.min" 
      }, 
      { 
      "name": "aurelia-testing", 
      "path": "../node_modules/aurelia-testing/dist/amd", 
      "main": "aurelia-testing", 
      "env": "dev" 
      } 
     ] 

ich weiß, ich habe den folgenden Code verwenden (wie ich in meinem alten Durandal App tat) Knockout sichere Bindung zu aktivieren:

var options = { 
     attribute: "data-bind",  // default "data-sbind" 
     globals: window,    // default {} 
     bindings: ko.bindingHandlers, // default ko.bindingHandlers 
     noVirtualElements: false  // default true 
    }; 
ko.bindingProvider.instance = new ko.secureBindingsProvider(options); 

aber ich weiß nicht, wie es zu benutzen in diesem neuen Aure LiApp, oder im Allgemeinen, wie man das Aurelia-Knockout-Plugin benutzt, um die sichere bindende Version von Knockout zu benutzen. Ich habe meine main.js versucht modifizierende Datei wie folgt aus:

export function configure(aurelia) {   
    var options = { 
     attribute: "data-bind",  // default "data-sbind" 
     globals: window,    // default {} 
     bindings: ko.bindingHandlers, // default ko.bindingHandlers 
     noVirtualElements: false  // default true 
    }; 
    ko.bindingProvider.instance = new ko.secureBindingsProvider(options); 

    aurelia.use 
     .standardConfiguration() 
     .developmentLogging()   
     .plugin('aurelia-knockout'); 

    return aurelia.start().then(() => aurelia.setRoot()); 
} 

oder sogar die aurelia-knockout.js Datei im npm Modul zwicken, die sichere Datenflußdefinition Einfügen kurz vor dieser Linie

ko.applyBindings(executionContext, this.element); 

aber, selbst wenn ich keine Build-Fehler (ich baue mit dem Befehl "au build") keine der oben genannten funktioniert.

UPDATE

eingefügt I Kö Initialisierungscode in der 1. Zeile wie so

define(['exports', 'aurelia-dependency-injection', 'aurelia-templating', 'knockout-secure-binding'], function (exports, _aureliaDependencyInjection, _aureliaTemplating, _knockoutSecureBinding) { 
direkt in

node_modules\aurelia-knockout\dist\amd\aurelia-knockout-custom-attribute.js 

und I hinzugefügt einen Verweis auf den sicheren Bindungsmodul befestigt Bindung

und jetzt bekomme ich diesen Fehler:

Unhandled rejection TypeError: ko.secureBindingsProvider is not a constructor 

als ob das sichere Bindungsmodul nicht gefunden/geladen wurde.

Wie auch immer, ich glaube nicht, dass das Verquirlen mit der "built" -Version eines node_moduls die ideale Lösung ist, ich suche nur nach einer Möglichkeit, es zum Laufen zu bringen. Ich freue mich immer noch auf bessere Vorschläge.

Antwort

0

Ok Ich habe eine funktionierende Lösung gefunden:

Zuerst in aurelia.json Datei ich die "loader" Eigenschaft wie das definieren:

"loader": { 
     "type": "require", 
     "configTarget": "vendor-bundle.js", 
     "includeBundleMetadataInConfig": "auto", 
     "config": { 
     "waitSeconds": 0, 
     "paths": { 
      "jquery": "../scripts/lib/cdn/jquery-3.1.0.min", 
      "knockout": "../scripts/lib/knockout-3.4.0"   
     } 
     }, 
     "plugins": [ 
     { 
      "name": "text", 
      "extensions": [ 
      ".html", 
      ".css" 
      ], 
      "stub": true 
     } 
     ] 
    }, 

auf diese Weise ich Knockout "global" definiert haben.Das „Bündel“ Eigenschaft wird so definiert:

"bundles": [ 
     { 
     "name": "app-bundle.js",   
     "source": [ 
      "[**/*.js]", 
      "**/*.{css,html}" 
     ] 
     }, 
     { 
     "name": "vendor-bundle.js", 
     "prepend": [ 
      "node_modules/bluebird/js/browser/bluebird.core.js",   
      "scripts/lib/require.js" 
     ], 
     "dependencies": [ 
      "aurelia-binding", 
      "aurelia-bootstrapper", 
      "aurelia-dependency-injection", 
      "aurelia-event-aggregator", 
      "aurelia-fetch-client", 
      "aurelia-framework", 
      "aurelia-history", 
      "aurelia-history-browser", 
      "aurelia-loader", 
      "aurelia-loader-default", 
      "aurelia-logging", 
      "aurelia-logging-console", 
      "aurelia-metadata", 
      "aurelia-pal", 
      "aurelia-pal-browser", 
      "aurelia-path", 
      "aurelia-polyfills", 
      "aurelia-route-recognizer", 
      "aurelia-router", 
      "aurelia-task-queue", 
      "aurelia-templating", 
      "aurelia-templating-binding", 
      { 
      "name": "text", 
      "path": "../scripts/lib/text" 
      }, 
      { 
      "name": "aurelia-templating-resources", 
      "path": "../node_modules/aurelia-templating-resources/dist/amd", 
      "main": "aurelia-templating-resources" 
      }, 
      { 
      "name": "aurelia-templating-router", 
      "path": "../node_modules/aurelia-templating-router/dist/amd", 
      "main": "aurelia-templating-router" 
      }, 
      { 
      "name": "aurelia-knockout", 
      "path": "../node_modules/aurelia-knockout/dist/amd", 
      "main": "aurelia-knockout" 
      },   
      { 
      "name": "aurelia-testing", 
      "path": "../node_modules/aurelia-testing/dist/amd", 
      "main": "aurelia-testing", 
      "env": "dev" 
      }, 
      { 
      "name": "icheck", 
      "path": "../node_modules/icheck", 
      "main": "icheck.min" 
      }, 
      { 
      "name": "filesaver.js", 
      "path": "../node_modules/filesaver.js", 
      "main": "FileSaver.min" 
      } 
     ] 
     } 

nun alle Plugins, die ich lade ich in den main.js erfordern, bevor die App gestartet wird, und ich fügen Sie die entsprechenden Plugins zum globak „ko“ Variable:

Jetzt, wenn das Aurelia-Knockout-Plugin die Bindung durchführt, verwendet es die "Knockout-Secure-Binding" -Instanz, wie ich es wünsche.