Python和angang在变量值上存在分歧

Python and angular disagree on variable value

本文关键字:存在 变量值 angang Python      更新时间:2023-09-26

所以,为了恰当地构建这一点,我在这里继承了一个代码库,我对角度没有深入的了解。基本上,有一个应用程序根据数据库导入是否已完成来显示或隐藏加载 gif。

但是由于某种原因,尽管数据集导入已完成角度无法识别它。简化的代码示例如下:

<h4>Status
    <small ng-hide="dataset.failed">{{ dataset.status }}</small>
    <img class="pull-right" ng-hide="(dataset.import_complete || dataset.failed)" src="/url" height="12">
</h4>
    <span>{{ dataset.import_complete }}</span>

我为调试目的添加的跨度,但本质上跨度显示True,而上面的img标记仍在显示。这意味着角度正在评估dataset.import_complete || dataset.failedFalse

为什么会这样?任何帮助调试此行为的建议将不胜感激。

更新:我认为这里的想法是这里发生了一些错误的类型检查。具体而言,以下情况似乎是正确的:

# Always evaluates to True, regardless of import_complete
dataset.import_complete == True
# Always evaluates to False, again, regardless of import_complete
dataset.import_complete == 'True'
# result is bool, as it should be, making this only more baffling
type(dataset)

另外,这里有一些后端,但可能不是很有帮助:

@route(bp, '/dataset/<int:dataset_id>', methods=["GET", "POST"])

定义数据集(dataset_id(: ""返回数据集管理页面"">

dataset = Dataset.query.get_or_404(dataset_id)
return render_template(
    'manage/dataset.html',
    dataset=dataset,
)

有关更多信息,以下是 vars(dataset) 的输出:

{'import_complete': True, 'failed': False, 'pending_deletion': False}

在 NG 运行之前,您的表达式是否被 Jinja2 插值?

不要忘记Jinja和Angular都使用相同的{{}}令牌作为语法。

在我看来,你正在使用Jinja来渲染那个HTML,如果那个HTML也包含你的AngularJS代码,那么在AngularJS在浏览器上运行之前,{{ expr }}会被Flask/Jinja

插值。

我的猜测是你在HTML中看到的True,来自Jinja2渲染这个表达式(不是Angular(

<span>{{ dataset.import_complete }}</span>

而且至少关键import_complete undefined在 Angular 应用程序$scope的 dataset JS 对象中。(因为someObject.undefinedKey == 'True'会给JS布尔false(

$scope.dataset对象很可能存在于您的ng应用程序中,但似乎$scope.dataset不包含键import_complete(要使ng-hide="dataset.import_complete"工作,您需要$scope.dataset.import_complete明确定义(

如何检查?

要确认实际上是 Jinja2 渲染了上述内容,请尝试通过保存 curlwget 来查看 HTML,您应该看到它在静态 HTML 中没有带有 <span>{{ dataset.import_complete }}</span> 供 NG 运行,而是带有<span>True</span>

如何修复

如果这是真的,那么尝试通过分离服务器/API 和客户端来适应你的项目,以更结构化的方式适应你的项目

否则,为了快速修复,您可以将角度应用程序的令牌更改为其他内容,然后弄清楚如何将变量放入您的$scope(例如,在 Jinja 中渲染$scope.dataset = {{dataset_json}};以将其放入 JS,从长远来看,您希望避免的黑客攻击(

调试

如果此<span>{{ dataset.import_complete }}</span>显示True输出,则确实表明键import_complete实际上包含具有值"True"的字符串,而不是JS布尔true

我侦察你的评论,你说你试图无济于

ng-hide="dataset.import_complete == 'True'"

这似乎是可能的,但我不知道如何调试它。

所以我建议你研究一下dataset对象的值,就像这样。

<p>{{dataset}}</p>或者也许<p>{{dataset | json}}</p>,那么您可以确定它的价值和类型

您还可以查看浏览器的开发工具"网络"选项卡,以查看 Flask 后端已发送回 AngularJS 的内容。