AngularJS fromJson返回字符串?

哈尔克比西

我正在尝试使用AngularJS的UI-Router来嵌套视图,这似乎正在工作。但是,在第97行中,您将找到一个解析,该解析将延迟嵌套视图的初始化,直到接收和处理数据为止。

您会注意到,我正在将json提要捕获到localStorage中(第123行)。我使用它来保存每个帖子的副本以进行快速数据检索和UI绑定,而不必等待第二个Ajax请求来检索该数据。

问题

如果单击,那么从ajax请求返回的任何链接都将显示一个嵌套视图。填充视图的数据似乎已完全转换为文本。没有HTML标签呈现为HTML ...一个完整的字符串。

诊断

我不确定是什么原因造成的。可能是因为我使用jQuery Ajax调用来检索该信息吗?

我以前曾尝试使用Angular自己的$ http.jsonp,但我一直遇到类型错误,我只是想不起来...所以,也许angular擅长仅“读取”数据?我个人想在这个小应用程序中放弃jQuery,但这似乎是唯一的选择是为我检索数据而没有问题。

请求

希望将数据绑定到最终的嵌套视图以呈现为HTML,而不是字符串。谢谢!jsFiddle:http : //jsfiddle.net/halkibsi/Z5aEs/11/

注意

此应用程序的三级嵌套视图在Firefox中不显示,仅在Chrome和Safari浏览器中有效。没有在IE或Opera中测试。

    // LOAD MODULES
    angular.module('myApp', ['ui.router'])
.run([ '$rootScope', '$state', '$stateParams', function ($rootScope, $state, $stateParams) {
    $rootScope.$state = $state;
    $rootScope.$stateParams = $stateParams;
  }]);


    /*************************/
    // STATES
    /*************************/
    angular.module('myApp')
    .config( ['$stateProvider', '$urlRouterProvider', function ( $stateProvider, $urlRouterProvider ) {

    /***************************/
    // Redirects and Otherwise //
    $urlRouterProvider
        .when('/en', '/en/news')
        .otherwise('/');


    /************************/
    // State Configurations //
    $stateProvider

        /********/
        // HOME //
        /********/
        .state('home', {
            url: '/',
            template: 
                '<div>'+
                '<header class="section-title"><h1>HOME</h1></header>'+
                '<ul class="nav">'+
                '<li ng-class="{ active: $state.includes(\'arabic\') }"><a ui-sref="arabic">عربي</a></li>'+
                '<li ng-class="{ active: $state.includes(\'english\') }"><a ui-sref="english">English</a></li>'+
                '</ul>'+
                '</div>',
        })

        /**********/
        // ARABIC //
        /**********/
        .state('arabic', {
            url: '/ar',
            //abstract: true,
            template:
                '<div dir="rtl">'+
                    '<header class="section-title"><h1>الواجهة العربية</h1></header>'+
                    '<ul class="nav">'+
                        '<li ng-class="{ active: $state.includes(\'home\') }"><a ui-sref="home">الصفحة الرئيسية</a></li>'+
                        '<li ng-class="{ active: $state.includes(\'english\') }"><a ui-sref="english">English Interface</a></li>'+
                        '<li><a href="#/ar/ndc-news">أخبار</a></li>'+
                        '<li><a href="#/ar/ndc-photos">صور</a></li>'+
                        '<li><a href="#/ar/ndc-videos">فيديو</a></li>'+
                        '<li><a href="#/ar/ndc-podcasts">صوتيات</a></li>'+
                    '</ul>'+
                    '<!-- MAIN UI VIEW FOR THIS TEMPLATE -->'+
                    '<div ui-view ng-animate="{enter:\'fade-enter\'}"></div>'+
                '</div>',
        })

        /***********/
        // ENGLISH //
        /***********/
        .state('english', {
            //abstract: true,
            url: '/en',
            template:
                '<div>'+
                    '<header class="section-title"><h1>English Interface</h1></header>'+
                    '<ul class="nav">'+
                        '<li ng-class="{ active: $state.includes(\'home\') }"><a ui-sref="home">Home</a></li>'+
                        '<li ng-class="{ active: $state.includes(\'arabic\') }"><a ui-sref="arabic">الواجهة العربية</a></li>'+
                        '<li ng-class="{ active: $state.includes(\'english.news\') }"><a ui-sref="english.news">News</a></li>'+
                        '<li ng-class="{ active: $state.includes(\'english.photos\') }"><a ui-sref="english.photos">Photos</a></li>'+
                        '<li ng-class="{ active: $state.includes(\'english.videos\') }"><a ui-sref="english.videos">Videos</a></li>'+
                        '<li ng-class="{ active: $state.includes(\'english.podcasts\') }"><a ui-sref="english.podcasts">Podcasts</a></li>'+
                    '</ul>'+
                    '<!-- MAIN UI VIEW FOR THIS TEMPLATE -->'+
                    '<div ui-view ng-animate="{enter:\'fade-enter\'}"></div>'+
                '</div>',
        })

            // English -> NDC News
            .state('english.news', {
                url: '/news',
                template:
                    '<header class="section-title"><h2>News</h2></header>'+
                    '<ul>'+
                      '<li ng-repeat="post in posts"><a ui-sref="english.news.single({postId:post.id})">{{ post.title }}</a></li>'+
                    '</ul>'+
                        '<div style="margin: 0 0 0 2em;">'+
                        '<!-- MAIN UI VIEW FOR THIS TEMPLATE -->'+
                        '<div class="ui-view-lev2" ui-view></div>'+
                    '</div>',
                resolve: {
                    news: function() {
                            return $.ajax({
                                type: "GET",
                                url: "http://ndcye.org/api/get_posts/?post_type=post&cat=3&callback=?",
                                dataType: "jsonp",
                                success: function(response){
                                    //console.log(response);

                                    var newsList = [];
                                    for ( var i=0; i < response.posts.length; i++) {

                                        var id = response.posts[i].id;
                                        var title = response.posts[i].title;
                                        var thumbnail = response.posts[i].thumbnail_images.mobile.url;
                                        var excerpt = response.posts[i].excerpt;
                                        var content = response.posts[i].content;

                                        // SAVE POST AS AN OBJECT
                                        var post_object = {
                                            id: id,
                                            title: title,
                                            thumbnail: thumbnail,
                                            excerpt: excerpt,
                                            content: content,
                                        };
                                        if (localStorage.getItem( 'post_object_'+id ) === null) {
                                            localStorage.setItem( 'post_object_'+id, angular.toJson(post_object) );
                                        }

                                        newsList.push(post_object);
                                    }

                                    localStorage.setItem( 'ndc_news', angular.toJson(newsList) );
                                    console.log( newsList );
                                },
                                error: function(){
                                    console.log("error!");
                                }
                            });
                    }
                },
                controller: ['news', '$scope', '$state', function (news, $scope, $state) {
                    $scope.posts = news.posts;
                    console.log($scope.posts);
                }], // controller end
            })

                // English -> NDC News Single
                .state('english.news.single', {
                    url: '/{postId:[0-9]{1,4}}',
                    template:
                        '<header class="section-title"><h3>{{ singlePost.title }}</h3></header>'+
                        '<div>{{ singlePost.content }}</div>',
                    controller: ['$scope', '$state', '$stateParams', function ($scope, $state, $stateParams) {
                        var singlePost = '';
                        singlePost = angular.fromJson( localStorage.getItem( 'post_object_' + $stateParams.postId ) );

                        $scope.singlePost = singlePost;
                        console.log( singlePost );
                    }]
                })








            // English -> NDC Photos
            .state('english.photos', {
                url: '/photos',
                template:
                    '<header class="section-title"><h2>Photos</h2></header>'+
                    'Photo albums go here',
            })

            // English -> NDC Videos
            .state('english.videos', {
                url: '/videos',
                template:
                    '<header class="section-title"><h2>Videos</h2></header>'+
                    'YouTube playlists go here',
            })

            // English -> NDC Podcasts
            .state('english.podcasts', {
                url: '/podcasts',
                template:
                    '<header class="section-title"><h2>Podcasts</h2></header>'+
                    'Podcast playlists go here',
            })



  } // end function ($stateProvider,   $urlRouterProvider)

    ]) // end .CONFIG
    ; // ens STATES
音乐

该程序存在两个问题:

  1. 您曾经{{ ... }}绑定singlePost.content到HTML。这必然逃脱了HTML
  2. 仅使用ng-bind-html="singlePost.content"不起作用,因为angular现在仅呈现受信任的HTML

唯一需要的更改是在状态 english.news.single

.state('english.news.single', {
  url: '/{postId:[0-9]{1,4}}',
  template:
          '<header class="section-title"><h3>{{ singlePost.title }}</h3></header>'+
          '<div ng-bind-html="content"></div>',
  controller: ['$scope', '$state', '$stateParams', '$sce', function ($scope, $state, $stateParams, $sce) {
          var singlePost = '';
          singlePost = angular.fromJson( localStorage.getItem( 'post_object_' + $stateParams.postId ) );

          $scope.singlePost = singlePost;
          $scope.content = $sce.trustAsHtml(singlePost.content);
          console.log( singlePost );
  }]
})

工作示例:http : //jsfiddle.net/Z5aEs/12/

旁注:它也适用于Firefox 25。

本文收集自互联网,转载请注明来源。

如有侵权,请联系[email protected] 删除。

编辑于
0

我来说两句

0条评论
登录后参与评论

相关文章

来自分类Dev

AngularJS如何返回字符串而不是Json对象

来自分类Dev

angularjs指令:$ watch返回字符串而不是对象

来自分类Dev

根据angularJS中的日期返回各种字符串

来自分类Dev

AngularJS连字符字符串

来自分类Dev

从AngularJS模板字符串生成HTML字符串

来自分类Dev

如何将以字符串格式从webapi返回的日期转换为AngularJs的javascript日期格式

来自分类Dev

AngularJS-$ parse.assign不为包含'-'的字符串返回函数错误

来自分类Dev

如果value为0,则在Angularjs中返回空字符串

来自分类Dev

搜索特定字符串的数组并将值返回到 AngularJS 视图

来自分类Dev

AngularJS转换动态字符串

来自分类Dev

在AngularJS中删除查询字符串

来自分类Dev

模板上的AngularJS字符串替换

来自分类Dev

在Angularjs中绑定变量的字符串

来自分类Dev

AngularJS忽略字符串中的空格

来自分类Dev

HTML中的AngularJS字符串替换

来自分类Dev

清理字符串以使用angularjs

来自分类Dev

AngularJS-服务公开字符串

来自分类Dev

遍历Angularjs中的JSON字符串

来自分类Dev

AngularJS:更改字符串格式

来自分类Dev

在AngularJS中替换字符串中的字符

来自分类Dev

AngularJS和量角器-getLocationAbsUrl()不返回url(字符串),而是一个对象

来自分类Dev

AngularJS:AJAX返回是一个字符串,而不是一个对象

来自分类Dev

从mvc控制器检索用户名时,AngularJS $ http总是返回null或空字符串

来自分类Dev

如何编写angularjs过滤器以搜索字符串片段/字符串序列

来自分类Dev

如何编写angularjs过滤器以搜索字符串片段/字符串序列

来自分类Dev

将AngularJS模板另存为字符串

来自分类Dev

显示字符串在HTML angularjs中的样子

来自分类Dev

AngularJS-从字符串中获取$ scope变量

来自分类Dev

如何使用AngularJS在click事件中传递字符串?

Related 相关文章

  1. 1

    AngularJS如何返回字符串而不是Json对象

  2. 2

    angularjs指令:$ watch返回字符串而不是对象

  3. 3

    根据angularJS中的日期返回各种字符串

  4. 4

    AngularJS连字符字符串

  5. 5

    从AngularJS模板字符串生成HTML字符串

  6. 6

    如何将以字符串格式从webapi返回的日期转换为AngularJs的javascript日期格式

  7. 7

    AngularJS-$ parse.assign不为包含'-'的字符串返回函数错误

  8. 8

    如果value为0,则在Angularjs中返回空字符串

  9. 9

    搜索特定字符串的数组并将值返回到 AngularJS 视图

  10. 10

    AngularJS转换动态字符串

  11. 11

    在AngularJS中删除查询字符串

  12. 12

    模板上的AngularJS字符串替换

  13. 13

    在Angularjs中绑定变量的字符串

  14. 14

    AngularJS忽略字符串中的空格

  15. 15

    HTML中的AngularJS字符串替换

  16. 16

    清理字符串以使用angularjs

  17. 17

    AngularJS-服务公开字符串

  18. 18

    遍历Angularjs中的JSON字符串

  19. 19

    AngularJS:更改字符串格式

  20. 20

    在AngularJS中替换字符串中的字符

  21. 21

    AngularJS和量角器-getLocationAbsUrl()不返回url(字符串),而是一个对象

  22. 22

    AngularJS:AJAX返回是一个字符串,而不是一个对象

  23. 23

    从mvc控制器检索用户名时,AngularJS $ http总是返回null或空字符串

  24. 24

    如何编写angularjs过滤器以搜索字符串片段/字符串序列

  25. 25

    如何编写angularjs过滤器以搜索字符串片段/字符串序列

  26. 26

    将AngularJS模板另存为字符串

  27. 27

    显示字符串在HTML angularjs中的样子

  28. 28

    AngularJS-从字符串中获取$ scope变量

  29. 29

    如何使用AngularJS在click事件中传递字符串?

热门标签

归档