【问题标题】:String with variables binding in AngularjsAngularjs中带有变量绑定的字符串
【发布时间】:2016-03-11 19:48:50
【问题描述】:

我有一个长字符串文本,我在要替换的值前面有 @ 符号。注意:生成长文本,它在文本文件中,在我读取文件后,我将它放在如下变量中:

$scope.text = "example @by goes @you";

我说“by”和“you”变量,我将如何简单地应用它以便在视图中文本获得正确的值?我该怎么做?

我可以创建自定义过滤器并搜索 @by 和 @you 并替换值或类似技术,但也许有一种简单的方法,我不知道 angular 在这种情况下使用。谢谢

【问题讨论】:

  • 不清楚你问了什么。
  • 生成长文本,在文本文件中。
  • 看看fearphage的回答

标签: javascript angularjs ionic-framework


【解决方案1】:

为什么在 $digest 一遍又一遍地做,而您可以轻松地转换从 te 服务器传入的数据,而只需修改一次?

我创建了一个 Plunker 来做这件事。

angular.module('myApp', []);

angular.module('myApp').service('DataService', ['$http', '$q', function($http, $q) {
  function getData() {
    return $q(function(resolve, reject) {
      $http.get('./response.json').then(function(response) {
        resolve(response.data.value);
      });      
    });

  }

  this.getData = getData;
}]);

angular.module('myApp').controller('MyController', ['DataService', function(DataService) {
  var mv = this;
  mv.data = 'retrieving data';
  var filtered = false;

  var filterValues= {
    '@first_name': 'Hans',
    '@last_name': 'Pock',
    '@age': '79'
  };

  DataService.getData().then(function(response) {
    mv.data = filter(response, filterValues);
  });

  function filter(text, values) {
    var result = text;
    angular.forEach(values, function(value, key){
      var regexp = new RegExp(key, 'g');
      result = result.replace(regexp, value);
    });
    return result;
  }
}]);

【讨论】:

  • 你说得对,我在某些时候注意到了摘要圈。但是你将如何解决它,假设我有一个获取数据并返回它的服务,但我想在获取数据后而不是在服务中更改值。
  • 有这方面的消息吗?服务出结果后怎么办,DataService.getData().then(function(response) { mv.data = response; //do it here });
  • 我已经 fork 我原来的 plunkr 并将过滤器迁移到控制器,你可以在这里查看:plnkr.co/edit/iVdcLoCSHnmTRHSPEgzy?p=preview
  • 好的,谢谢,但不知何故我找不到区别,我上面的意思是,我在控制器中有来自不同服务的过滤器值,我想在其他服务获取数据后应用它,所以需要在控制器中应用。
  • 看来我为您提供了旧链接,我已经更新了那个 plunker 中的代码:plnkr.co/edit/iVdcLoCSHnmTRHSPEgzy?p=preview
【解决方案2】:

如果我理解正确你想要这个。我创建了一个 plnkr 供你查看。

 var app = angular.module('plunker', []);

app.controller('MainCtrl', function($scope) {   $scope.name = 'World';
    $scope.text = "example @by goes @you"; });

app.filter('byfilter',function(){   return function(input,by,you){

    return input.replace('@by',by).replace('@you',you);
       } })

{{text|byfilter:'furkan':'ahmet'}}

例子 furkan 去 ahmet

http://plnkr.co/edit/GDXhSVxyDn8zeNK9HR3u?p=preview

【讨论】:

  • 这正是我想要的。谢谢你。如果您有长文本,是否有任何关于性能的说明?
  • 不客气@karma,对于性能问题,我可以指出该链接与您的情况不同,但您可以在那里找到类似的信息。 stackoverflow.com/questions/17969207/…
  • 我认为在运行时执行此操作会产生很多不必要的开销,当您收到数据时执行一次即可轻松避免这些开销。
  • 当然,当有大量文本时,过滤一次会更好,根据您的文本大小,将过滤到 js 端会提供更好的性能。
  • 这个解决方案的问题是你只会过滤第一次出现,而不是全部。这可以通过搜索带有修饰符 g(lobal) 的正则表达式来解决
【解决方案3】:

这是一个简单的 JavaScript。我不明白这与 Angular 有什么关系。

$scope.name = 'John';
$scope.age = 25;
$scope.text = 'My name is ' + $scope.name + ' and I\'m ' + $scope.age + ' years old';

【讨论】:

  • 对不起,我不创建长文本,我从文件或API或服务器等获取它。如果我会创建它,那就很简单了。
猜你喜欢
  • 2018-01-07
  • 2011-04-13
  • 2013-03-08
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多