Python和角度对变量值不一致

时间:2016-04-30 18:23:39

标签: javascript python angularjs flask jinja2

所以,为了适当地构建它,我在这里继承了一个代码库,我对角度没有深入的了解。基本上,有一个应用程序根据数据库导入是否已完成显示或隐藏加载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"])

def数据集(dataset_id):     msgstr“”“返回数据集管理页面”“”

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}

1 个答案:

答案 0 :(得分:1)

在NG甚至运行之前,你的表达是否被Jinja2插值?

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

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

我的猜测是您在HTML中看到的True,来自 Jinja2呈现此表达式(不是Angular)

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

并且至少 import_complete在您的Angular应用的$ scope中的undefined JS对象中是dataset。 (因为someObject.undefinedKey == 'True'会给出JS布尔false

{ng}应用中可能存在$scope.dataset对象,但似乎$scope.dataset包含密钥import_completeng-hide="dataset.import_complete"无效,你明确需要明确定义$scope.dataset.import_complete

如何检查?

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

如何修复

如果是这样,那么try adapting more structured way this to your project, by separating the server/API and the client

否则为了快速解决问题,您可以change the tokens for your angular app to something else,然后弄清楚如何将变量放入$scope(例如,在Jinja中渲染$scope.dataset = {{dataset_json}};以获取它进入JS,a 黑客,你想长期避免

调试

如果此<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的内容。