Maison > Questions et réponses > le corps du texte
现有 angularjs 问题俩枚
一.
通过 $http 加载了一篇文章,该文章有标题, 现想实现文章加载后将文章标题替换掉浏览器标题. html 结构如下
<!doctype html>
<html data-ng-app="app">
<head data-ng-controller="head">
<meta charset="utf-8"/>
<titlte data-ng-bind="title||'Document'"></title>
</head>
<body>
<p data-ng-controller="main">
<button data-ng-click="getPost()">GET POST</button>
<p data-ng-module="post">
<h2 data-ng-bind="post.title"></h2>
<article data-ng-bind="post.content"></article>
</p>
</p>
</body>
</html>
也就是 post 加载后浏览器标题和 post.title 显示一样.
已搜索过跨域通信的解决方案, 并且看到了 这里(AngularJS控制器controller如何通信?) , 这三种方法, 前俩种并部适合我当前这个结构, 因此使用第三种方式, 并且也是实现了同步, 但是致命的是需要通过一个触发(点击 等)才能够同步, so 其实直白了就是想问问怎么能够自动同步 而不是通过触发来同步.
二.
$scope 回调,
还拿这个加载文章来说, 比如加载的文章中有 pre 标签包裹的代码快, 在加载后, 要通过其他库来实现高亮, so 需要在数据绑定并且渲染完毕后来执行高亮操作. 但是并没有搜到什么解决方案.
自己也写了些, 俩中方案
第一种:
数据绑定后以后递归查询当前页面的所有 pre 标签, 找到后或者限定次数后 高亮 结束.
第二种:
window.setTimeout(function(){}, 1000);
俩中结果了, 第一种是不行的. 无论递归多少次都无法找到 pre 标签
第二种可行, 不过感觉这并不是一个好的解决方案
巴扎黑2017-05-15 16:54:56
Vous ne comprenez pas très bien ce que vous entendez par communication inter-domaines ? Serait-ce une communication entre contrôleurs ? Et déclencheur ?
1. Écrivez simplement ng-bind directement sans utiliser data-* comme ça
2. Le contrôleur où se trouve <title>
est au même niveau que le contrôleur main
. Vous pouvez ajouter un contrôleur parent en dehors d'eux et mainController.$scope.$parent.title = post.title
, ou utiliser directement $rootScope (non recommandé). Vous pouvez également le faire via $emit/$broadcast/$on mais ce n'est pas nécessaire.
Puis :
<title ng-bind="$parent.title||'Default Title'"></title>
3. Vous pouvez rechercher de bons plug-ins de mise en évidence sur github en utilisant angular highlight
comme mot-clé. installation de la tonnelle de
4. N'utilisez pas window.setTimeout. Utilisez $timeout()
fourni par angulaire, cela renverra une promesse.
5. En fait, une meilleure façon de résoudre le deuxième problème est d'utiliser le service $resource.get().$promise.then();
// ou $http pour garantir que les données distantes sont chargées avant l'exécution.
PHP中文网2017-05-15 16:54:56
Ajoutez une classe wtitle
à l'élément titre dans le modèle qui restitue l'article, et le titre de la page actuelle sera remplacé par le titre de l'article.
Vous pouvez également le faire dans WeChat~
La fonction de wtitle est de définir le contenu de element.text() comme document.title. Le but de l'utilisation d'iframe est de le rendre efficace dans la vue Web de l'application
.javascript
app.directive('wtitle', [ '$timeout', '$document', function($timeout, $document){ return { restrict: 'AC', link: function($scope, $element, $attrs){ var watch = $scope.$watch(function(){ return $element.text().replace(/(^\s*)|(\s*$)/g, ''); }, function(title){ // 空标题不显示 if(/^\s*$/.test(title)){ return; } $document[0].title = title; var $body = angular.element($document[0].body); var $iframe = angular.element(' <iframe style="visibility:hidden;" src="/path/to/iframe.png"></iframe> '); $iframe.on('load', function(){ $timeout(function(){ $iframe.off('load').remove(); }, 5); }); $body.append($iframe); }); $scope.$on('$destroy', watch); } }; } ]);