在Sencha Touch MVC App中更新子面板

时间:2011-08-30 01:39:08

标签: model-view-controller sencha-touch extjs

开发一个Sencha Touch MVC应用程序,用于从json存储中提取数据(这些应用程序设置为从Wordpress博客中提取内容的数据库)。

一切正常,直到我的“细节”面板。它不是倾听TPL,而是倾销一些数据。这些数据看起来与我的博客文章相似,但是其他代码却没有多大意义。

以下是我的清单精简版:

    myApp.views.PostListView = Ext.extend(Ext.Panel, {

    postStore: Ext.emptyFn,
    postList: Ext.emptyFn,
    id:'postlistview',
    layout: 'card',

    initComponent: function () {

       /* this.newButton = new Ext.Button({
            text: 'New',
            ui: 'action',
            handler: this.onNewNote,
            scope: this
        });*/

        this.topToolbar = new Ext.Toolbar({
            title: 'All Posts',
           /* items: [
                { xtype: 'spacer' },
                this.newButton
            ],*/
        });


        this.dockedItems = [ this.topToolbar ];

        this.postList = new Ext.List({
            store: myApp.stores.postStore,
            grouped: true,
            emptyText: '<div style="margin:5px;">No notes cached.</div>',
            onItemDisclosure: true,
            itemTpl: '<div class="list-item-title">{title}</div>' +
                            '<div class="list-item-narrative"><small>{body}</small></div>',

        });

        this.postList.on('disclose', function (record) {
            this.onViewPost(record);
        }, this),

        this.items = [this.postList];

        myApp.views.PostListView.superclass.initComponent.call(this);
    },
    onViewPost: function (record) {
        Ext.dispatch({
            controller: myApp.controllers.masterController,
            action: 'viewpost',
            post: record
        });
    },
});

以下是关于披露的“详细信息”视图:

myApp.views.PostSingleView = Ext.extend(Ext.Panel, { 

    title:'Single Post',
    id:'postsingleview',
    layout:'card',
    style:'background:grey;',

    initComponent: function () {

        this.new1Button = new Ext.Button({
            text: 'Back',
            ui: 'back',
            handler: this.onViewList,
            scope: this,
            dock:"left"
        });

        this.top1Toolbar = new Ext.Toolbar({
            items: [
                this.new1Button
            ],

            title: 'Single Posts',
        });

        this.postSinglePanel = new Ext.Panel({
            layout:'fit',
            flex:1,
            scroll: 'vertical',
            style:'padding:10px;background:yellow;',
            itemTpl: '<tpl for=".">' +
                        '<div class="list-item-narrative">{body}</div>' +
                     '</tpl>',
        });

        this.dockedItems = [ this.top1Toolbar, this.postSinglePanel ];

        myApp.views.PostSingleView.superclass.initComponent.call(this);
    },

    onViewList: function () {
        Ext.dispatch({
            controller: myApp.controllers.masterController,
            action: 'viewlist',

        });
    },
});

这是与之交谈的控制器:

    Ext.regController('masterController', {


    'index': function (options) {

        if (!myApp.views.mainView) {
            myApp.views.mainView = new myApp.views.MainView();
        }

        myApp.views.mainView.setActiveItem(
            myApp.views.postView
        );
    },

    'viewpost': function (options) {

        myApp.views.postSingleView.postSinglePanel.update(options.post);
        myApp.views.postView.setActiveItem(
            myApp.views.postSingleView,
            { type: 'slide', direction: 'left' }
        );
    },

});

myApp.controllers.masterController = Ext.ControllerManager.get('masterController');

当数据出来时,它看起来类似于:

http://i.imgur.com/QlQG8.png

(黑框是“编辑”内容,没有错误代码)。

最后,我认为控制器将数据“转储”到“MyApp.views.PostSingleView”而不是按照我在TPL中的请求进行格式化,尽管我不确定如何修复它。任何和所有帮助很多人赞赏!

更新:根据要求,这是RegModel:

    Ext.regModel("CategoryModel", {
    fields: [
        {name: "id", type: "int"},
        {name: "title", type: "string"},
        {name: "body", type: "string"},
    ],
    hasMany: {
        model: 'Post',
        name: 'posts'
    }
});

以下是json的一个示例:

{
   "status":"ok",
   "post":{
      "id":1037,
      "type":"post",
      "slug":"post-title",
      "url":"http:\/\/localhost:8888\/jsontest\/PostTitle\/",
      "status":"publish",
      "title":"Post Title",
      "title_plain":"Post Title",
      "content":"<p>Lorem ipsum dolor sit amet, consectetur adipisicing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. Ut enim ad minim veniam, quis nostrud exercitation ullamco laboris nisi ut aliquip ex ea commodo consequat. Duis aute irure dolor in reprehenderit in voluptate velit esse cillum dolore eu fugiat nulla pariatur. Excepteur sint occaecat cupidatat non proident, sunt in culpa qui officia deserunt mollit anim id est laborum.<br \/>\nLorem ipsum dolor sit amet, consectetur adipisicing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. Ut enim ad minim veniam, quis nostrud exercitation ullamco laboris nisi ut aliquip ex ea commodo consequat. Duis aute irure dolor in reprehenderit in voluptate velit esse cillum dolore eu fugiat nulla pariatur. Excepteur sint occaecat cupidatat non proident, sunt in culpa qui officia deserunt mollit anim id est laborum.<\/p>\n<!-- PHP 5.x -->",
      "excerpt":"Lorem ipsum dolor sit amet, consectetur adipisicing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. Ut enim ad minim veniam, quis nostrud exercitation ullamco laboris nisi ut aliquip ex ea commodo consequat. Duis aute irure dolor in reprehenderit in voluptate velit esse cillum dolore eu fugiat nulla pariatur. Excepteur sint occaecat [...]",
      "date":"2011-07-29 14:17:31",
      "modified":"2011-08-30 01:33:20",
      "categories":[
         {
            "id":87,
            "slug":"the-category",
            "title":"The Category",
            "description":"",
            "parent":17,
            "post_count":5
         }
      ],
      "tags":[

      ],
      "author":{
         "id":2,
         "slug":"tom",
         "name":"tom",
         "first_name":"tom",
         "last_name":"",
         "nickname":"",
         "url":"",
         "description":""
      },
      "comments":[

      ],
      "attachments":[

      ],
      "comment_count":0,
      "comment_status":"open"
   },
   "previous_url":"http:\/\/localhost:8888\/jsontest\/next-post\/",
   "next_url":"http:\/\/localhost:8888\/jsontest\/prev-post\/"
}

3 个答案:

答案 0 :(得分:1)

使用Ext.Panel的 tpl 配置选项而不是不存在的itemTpl。

如前所述,使用Model实例和更新方法时要小心,您需要使用模型的数据属性。

答案 1 :(得分:0)

尝试使用:

myApp.views.postSingleView.postSinglePanel.update(options.post.data);

原因是post实际上没有直接公开底层数据,你需要使用属性数据。

还有什么特别的原因可以对接postSinglePanel?我会非常小心地使用太多停靠项目,因为它们是已知的错误和布局问题的来源。

答案 2 :(得分:0)

一种简单的方法是编写自己的方法来更新子面板(您也可以看到覆盖默认的更新方法)

myApp.views.PostSingleView = Ext.extend(Ext.Panel, { 
   initComponent: function () {
      // [...]
   },

   // [...]

   myUpdate: function(data) {
      this.postSinglePanel.update(data);
      this.doComponentLayout(); // not sure if necessary...
   }
});

并从您的控制器:

Ext.regController('masterController', {
    // [...]
    'viewpost': function (options) {

        myApp.views.postSingleView.myUpdate(options.post.data); // note the .data
        // [...]
    },

});