用Angular比Swig更有效地解释route视图中的数据

More efficient way to interpret data from route in view with Angular over Swig?

本文关键字:视图 route 数据 解释 有效地 Angular Swig      更新时间:2023-09-26

我有一个JSON对象数组从我的Node路由传递到它各自的视图。例如:

res.render("path/to/view", { data: result, data2: result2 })

,其中result和result2都是JSON对象数组。在我看来,我在一个ng-init函数中使用它们,就像这样:({{}}指定swig,其中我已经将[[]]更改为指定Angular,所以在下面的例子中,我们在使用我定义的Angular init函数之前使用swig)

<div ng-init="init( {{ data|json }} )"> </div>

我应该说上面的例子工作得很好,但是当"数据"成为一个非常大的数据集时,那么多的时间花在swig部分-即将其转换为JSON(再次…?)就像我说的,"数据"已经是JSON的形式,但是当我从上面的swig部分删除JSON时,我得到一个[$parse:syntax]错误,它给了我上面的行,但评估:

<div ng-init="init( [object Object],[object Object] )"> </div>

我已经尝试使用ng-init="init( [[ JSON.parse( {{ data }} ) ]] )"的变化,以便我评估输出到JSON(即使输出已经是..?),但不能得到任何工作。

任何想法?也许我的语法错了?我不明白,因为"数据"是JSON当我把它传递给视图,但我不能把它直接传递到我的init函数没有得到语法错误。

ng-init调用的内容从视图中取出,并将其放入控制器或服务中。

不使用ng-init的理由有很多,以至于Angular团队基本上建议你不要使用它:https://docs.angularjs.org/api/ng/directive/ngInit

我想我终于明白你想要做什么了,这叫做引导。您可以将数据嵌入视图服务器端,如下所示:

<script>
  angular.module("app").constant("myBootstrap", {{ data.stringified }});
</script>

其中data.stringified是您的字符串化数据。然后在Angular中,你可以将myBootstrap作为常量注入到任何你想要的控制器中,就像$rootScope一样,这样数据就可用了。

因此,虽然我不完全确定是什么导致它运行如此缓慢,但我已经找到了一个解决方案,尽管"黑客"可能更准确地描述它。我遇到的问题是Swig花了很长时间来模板我的数据,然后把它传递给init函数(我现在知道这是不好的做法;也就是说,使用ng-init来调用函数)。

我应该提醒未来的读者,我正在使用Node.js, Swig来做模板,Angular来处理MVC方面的事情。

查看上面的问题,看看我的代码之前是什么样子的(慢版本)。下面是我的解决方案:

<

路由一边/em>

var rawSQLData = makeSQLCall();
var parsedAsJsonSQLData = parseData(rawSQLData);
var parsedDataAsString = JSON.stringify(parsedAsJsonSQLData);
res.render("path/to/view", { data: parsedDataAsString });

<div ng-init=" init( {{ data|json }} )">   </div>
<

角控制器/em>

$scope.init = function(data){
    $scope.dataInScope = JSON.parse(data);
}

正如您所看到的,我唯一改变的是在将JSON发送到HTML之前对其进行字符串化,然后在它到达控制器后对其进行解析。

我认为这有效的原因是因为我基本上是在模板引擎(Swig)以外的部分做所有的JSON处理。我尝试不使用过滤器,但Swig默认将数据转换为JSON,这破坏了我的HTML。我之所以称其为破解而不是解决方案,是因为我们对数据进行了字符串化处理,然后对Swig使用json过滤器,根据文档:

返回JavaScript对象的字符串表示形式。

如果我不得不猜测,我会说,通过在字符串上使用json过滤器,Swig决定它没有任何关系,因为对象已经是一个字符串,只是传递它(正是我一直想要的!)。令人难以置信的是,当Swig不接触数据时,速度要快得多。JSON的字符串化和解析对于数据的大小来说非常快,而Swig要花40秒