link: function (scope, element, attrs, uiSrefActive) { var type = getTypeInfo(element); var active = uiSrefActive[1] || uiSrefActive[0]; var unlinkInfoFn = null; var hookFn; var rawDef = {}; var getDef = function () { return processedDef($state, element, rawDef); }; var ref = parseStateRef(attrs.uiSref); rawDef.uiState = ref.state; rawDef.uiStateOpts = attrs.uiSrefOpts ? scope.$eval(attrs.uiSrefOpts) : {}; function update() { var def = getDef(); if (unlinkInfoFn) unlinkInfoFn(); if (active) unlinkInfoFn = active.$$addStateInfo(def.uiState, def.uiStateParams); if (def.href != null) attrs.$set(type.attr, def.href); } if (ref.paramExpr) { scope.$watch(ref.paramExpr, function (val) { rawDef.uiStateParams = core_1.extend({}, val); update(); }, true); rawDef.uiStateParams = core_1.extend({}, scope.$eval(ref.paramExpr)); } update(); scope.$on('$destroy', $uiRouter.stateRegistry.onStatesChanged(update)); scope.$on('$destroy', $uiRouter.transitionService.onSuccess({}, update)); if (!type.clickable) return; hookFn = clickHook(element, $state, $timeout, type, getDef); bindEvents(element, scope, hookFn, rawDef.uiStateOpts); },
return function (scope, $element) { var data = $element.data('$uiView'); if (!data) { $element.html(initial); $compile($element.contents())(scope); return; } var cfg = data.$cfg || { viewDecl: {}, getTemplate: core_1.noop }; var resolveCtx = cfg.path && new core_1.ResolveContext(cfg.path); $element.html(cfg.getTemplate($element, resolveCtx) || initial); core_1.trace.traceUIViewFill(data.$uiView, $element.html()); var link = $compile($element.contents()); var controller = cfg.controller; var controllerAs = getControllerAs(cfg); var resolveAs = getResolveAs(cfg); var locals = resolveCtx && services_1.getLocals(resolveCtx); scope[resolveAs] = locals; if (controller) { var controllerInstance = $controller(controller, core_1.extend({}, locals, { $scope: scope, $element: $element })); if (controllerAs) { scope[controllerAs] = controllerInstance; scope[controllerAs][resolveAs] = locals; } // TODO: Use $view service as a central point for registering component-level hooks // Then, when a component is created, tell the $view service, so it can invoke hooks // $view.componentLoaded(controllerInstance, { $scope: scope, $element: $element }); // scope.$on('$destroy', () => $view.componentUnloaded(controllerInstance, { $scope: scope, $element: $element })); $element.data('$ngControllerController', controllerInstance); $element.children().data('$ngControllerController', controllerInstance); registerControllerCallbacks($q, $transitions, controllerInstance, scope, cfg); } // Wait for the component to appear in the DOM if (core_1.isString(cfg.viewDecl.component)) { var cmp_1 = cfg.viewDecl.component; var kebobName = core_1.kebobString(cmp_1); var tagRegexp_1 = new RegExp("^(x-|data-)?" + kebobName + "$", 'i'); var getComponentController = function () { var directiveEl = [].slice .call($element[0].children) .filter(function (el) { return el && el.tagName && tagRegexp_1.exec(el.tagName); }); return directiveEl && angular_1.ng.element(directiveEl).data("$" + cmp_1 + "Controller"); }; var deregisterWatch_1 = scope.$watch(getComponentController, function (ctrlInstance) { if (!ctrlInstance) return; registerControllerCallbacks($q, $transitions, ctrlInstance, scope, cfg); deregisterWatch_1(); }); } link(scope); };
forEach(viewsObject, function (config, name) { // Account for views: { "": { template... } } name = name || '$default'; // Account for views: { header: "headerComponent" } if (isString(config)) config = { component: config }; // Make a shallow copy of the config object config = extend({}, config); // Do not allow a view to mix props for component-style view with props for template/controller-style view if (hasAnyKey(compKeys, config) && hasAnyKey(nonCompKeys, config)) { throw new Error("Cannot combine: " + compKeys.join('|') + " with: " + nonCompKeys.join('|') + " in stateview: '" + name + "@" + state.name + "'"); } config.resolveAs = config.resolveAs || '$resolve'; config.$type = 'ng1'; config.$context = state; config.$name = name; var normalized = ViewService.normalizeUIViewTarget(config.$context, config.$name); config.$uiViewName = normalized.uiViewName; config.$uiViewContextAnchor = normalized.uiViewContextAnchor; views[name] = config; });
/** @hidden */ function processedDef($state, $element, def) { var uiState = def.uiState || $state.current.name; var uiStateOpts = core_1.extend(defaultOpts($element, $state), def.uiStateOpts || {}); var href = $state.href(uiState, def.uiStateParams, uiStateOpts); return { uiState: uiState, uiStateParams: def.uiStateParams, uiStateOpts: uiStateOpts, href: href }; }
scope.$watch(ref.paramExpr, function (val) { rawDef.uiStateParams = core_1.extend({}, val); update(); }, true);
return $q.all(promises).then(function (results) { trace.traceViewServiceEvent('Loaded', _this); _this.controller = results.controller; extend(_this, results.template); // Either { template: "tpl" } or { component: "cmpName" } return _this; });
var params = this.path.reduce(function (acc, node) { return extend(acc, node.paramValues); }, {});
function decoratedNg1Hook(trans, state) { var resolveContext = new core_1.ResolveContext(trans.treeChanges(pathname)); var subContext = resolveContext.subContext(state.$$state()); var locals = core_1.extend(services_1.getLocals(subContext), { $state$: state, $transition$: trans }); return core_1.services.$injector.invoke(hook, this, locals); }
function decoratedNg1Hook(trans, state) { var resolveContext = new ResolveContext(trans.treeChanges(pathname)); var locals = extend(getLocals(resolveContext), { $state$: state, $transition$: trans }); return services.$injector.invoke(hook, this, locals); }
var getStateProvider = function () { return extend(router.stateProvider, { $get: function () { return router.stateService; } }); };