@web-atoms/core-docs
Version:
70 lines • 2.64 kB
JavaScript
(function (factory) {
if (typeof module === "object" && typeof module.exports === "object") {
var v = factory(require, exports);
if (v !== undefined) module.exports = v;
}
else if (typeof define === "function" && define.amd) {
define(["require", "exports", "../core/AtomDisposableList", "../core/AtomOnce", "../core/AtomUri"], factory);
}
})(function (require, exports) {
"use strict";
Object.defineProperty(exports, "__esModule", { value: true });
const AtomDisposableList_1 = require("../core/AtomDisposableList");
const AtomOnce_1 = require("../core/AtomOnce");
const AtomUri_1 = require("../core/AtomUri");
/**
* Binds property of View Model to URL Parameter, it can read query string as well,
* however it will only persist value in hash
* @param vm View Model
* @param name property name of View Model
* @param urlParameter url parameter name
*/
function bindUrlParameter(vm, name, urlParameter) {
if (!name) {
return;
}
if (!urlParameter) {
return;
}
const a = vm;
const paramDisposables = (a.mUrlParameters || (a.mUrlParameters = {}));
const old = paramDisposables[name];
if (old) {
old.dispose();
paramDisposables[name] = null;
}
const disposables = new AtomDisposableList_1.AtomDisposableList();
const updater = new AtomOnce_1.AtomOnce();
disposables.add(a.setupWatch([
["app", "url", "hash", urlParameter],
["app", "url", "query", urlParameter]
], (hash, query) => {
updater.run(() => {
const value = hash || query;
if (value) {
// tslint:disable-next-line:triple-equals
if (value != vm[name]) {
vm[name] = value;
}
}
});
}));
disposables.add(a.setupWatch([[name]], (value) => {
updater.run(() => {
const url = vm.app.url || (vm.app.url = new AtomUri_1.AtomUri(""));
url.hash[urlParameter] = value;
vm.app.syncUrl();
});
}));
paramDisposables[name] = disposables;
if (vm.app.url) {
const v = vm.app.url.hash[urlParameter] || vm.app.url.query[urlParameter];
if (v) {
vm[name] = v;
}
}
return vm.registerDisposable(disposables);
}
exports.default = bindUrlParameter;
});
//# sourceMappingURL=bindUrlParameter.js.map