TOGOUTECH

javascript - EmberJS 嵌套 View 和 Controller

coder 2024-05-16 原文

我正在使用 EmberJS v1.0.pre 编写应用程序。我有一个 ArrayController,其中包含所有人员的列表。有一堆嵌套 View 显示人、他们的宠物和每只宠物的注释。

|----------------------------------------|
| John                                   | <- Person
|----------------------------------------|
|   Quincy (Dog)                         | <- Pet
|     - Super ornery                     | <- Note
|     - Likes XYZ Dog food               |
|     - Will eat your socks              |
|                                        |
|   Tom (Cat)                            |
|    - Always (not) catching mice        |
|                                        |
|----------------------------------------|
| Roger                                  |
|----------------------------------------|
|   V (Dog)                              |
|    - Likes XYZ Dog food                |
|    - Sneezes, but it's ok              |
|                                        |
|----------------------------------------|
| ...                                    |

从纯 MVC 的 Angular 来看,感觉每个 child 都应该有一个 Controller ,但我不知道如何在 Ember 中实现它。有最上面的 Array Controller ,然后是所有单独的 View 。如果我想删除或编辑笔记,似乎我需要将 View 的上下文传递给 Controller ​​。

// in the view
click: function () {
  this.get('controller').updateNote(this.get('content'))
}

这让我感觉很糟糕,View 不应该是数据的权威来源。我的假设是 ArrayController 会实例化 itemControlerClass 以及 itemViewClass

更新:我创建了一个 fiddle更好地说明我的问题。功能有意不完整,目的是通过单击列表中的项目时增加内容来完成功能。

更新:抱歉,我不小心删除了 fiddle !我正在为最终解决方案做一些工作,所以我将尝试创建一个带有解决方案的新 fiddle 。

最佳答案

"From the pure MVC standpoint it feels like there should be a controller for each child"

您不需要为每个项目使用一个 Controller ,而是为每个对象集合(人、宠物、笔记)使用一个 ArrayController。顺便说一句,对子对象(狗、笔记)的任何操作都不应该传递给 App.PersonsController。那会破坏 Separation of Concerns原则。

Ember.Router 文档涵盖了您想在单个对象中嵌套 View 的情况(例如 /:people_id)。但是您想嵌套对象数组的 View 。我想不出嵌套 {{outlet}} View 的方法,但您可以执行以下操作:

在3个ArrayController中加载People、Pets、Notes对象,并将子对象的 Action 委托(delegate)给对应的ArrayController。

App.Router = Ember.Router.extend({
  root: Ember.Route.extend({
    route: '/',
    persons: Ember.Route.extend({
        connectOutlets: function(router) {

          router.get('applicationController').connectOutlet('persons');
          // App.Note.find() fetches all Notes,
          // If you are not using ember-data, make sure the notes are loaded into notesController
          router.set('notesController.content', App.Note.find());
          router.set('petsController.content', App.Pet.find());
        }
    })
  })
});

然后您的people 模板应该如下所示:

{{#each person in people}}
  <h1>My name is {{person.name}}</h1>

  {{#each pet in person.pets}}
     I have a pet with name {{pet.name}}
     <a {{action delete pet target="App.router.petsController">Delete pet</a>
  {{/each}}      

  {{view Ember.TextField valueBinding="myNewPetName" type="text"}}
  <a {{action create myNewPetName person target="controller"}}>
    Add a new pet for this person
  </a>


  {{#each note in person.notes}}
    <!-- delete, create, edit ... -->
  {{/each}}

如您所见,对子对象的操作委托(delegate)给它的 Controller (pet -> petsController),将对象作为上下文传递。在 create 操作的情况下, Controller 需要知道宠物 belongsTo 属于哪个人。因此,我们传递了 2 个上下文:人和宠物的属性(为简单起见,我假设只是宠物的名字)。

在您的 App.petsControllers 中,您应该执行以下操作:

App.PetsController = Ember.ArrayController.extend({
   delete: function(e) {
     var context = e.context;
     this.get('content').removeObject(context);
     // Also, if you use ember-data,
     // App.Pet.deleteRecord(context);
   },

   create: function(e) {
     var petName = e.contexts[0]
     var person = e.contexts[1];
     this.get('content').pushObject({name: petName, person: person});
     // with ember-data:
     // App.Pet.createRecord({name: petName, person: person});
   }
});  

关于javascript - EmberJS 嵌套 View 和 Controller ,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/12602429/

有关javascript - EmberJS 嵌套 View 和 Controller的更多相关文章

  1. javascript - 如何在 ChartJS 中使用溢出滚动修复图表图例宽度-高度 - 2

    我想为我的元素创建饼图,所以我正在使用ChartJS,但是chartJS存在一些问题,如果我使用10到20个数据字段,那么时间图表看起来不错,但是当我我在一个图表中应用了50到60个以上的数据字段,所以图表看起来比图例小,如果有时数据字段比隐藏的图表多,你只能看到图例,图表就不见了。我想为该图例设置高度或宽度,如果有更多数据,也适用于滚动条。这是供您引用的fiddle链接https://jsfiddle.net/KDM1010/5um78rbk/<canvasid="myChart"width="500"height="300"&g

  2. javascript - Vue (nuxt) 中的全局组件 - 2

    在构建Vue应用程序时,我们在每个模板中重复使用某些Vue组件。我们的网格系统存在于.region、.layout、.grid、.column元素之外。它们都是独立的Vue组件(,...)。我们现在在每个模板中都这样做:importBlMainfrom'~components/frame/main/Main.vue'importBlRegionfrom'~components/frame/region/Region.vue'importBlLayoutfrom'~components/frame/layout/Layout.vue'imp

  3. javascript - Accessibility - React 确保点击事件有按键事件 - 2

    我想确保我所有的onClick事件都在onKeyDown事件旁边。我将使用eslint-plugin-jsx-a11y来确保这一点。但在代码中,这是一种实现这种泛型的方法。我的意思是,一直这样做会很烦人:if(event.keyCode===13){...}如果用户使用onClick中的执行函数,我希望有一种方法可以告诉onKeyDown中的元素。或者类似的解决方案http://www.karlgroves.com/2014/11/24/ridiculously-easy-trick-for-keyboard-accessibility/例如,在Angular方面,我很清楚。让我们寻找

  4. javascript - 函数式编程和 DOM 操作 - 2

    如何在以“函数式”方式编写的脚本中以最“纯粹”的方式操作DOM。例如,如果我只需要更改元素宽度,我应该使用像这样的典型语法:document.querySelector(".class").style.width=...或者编写专门的函数,比如:functionresize(el,w){returnel.style.width=w;}resize(document.querySelector(".class",100));我想,我了解函数式编程的一般概念,但我遇到的所有示例都集中在处理数字或字符串上。操作DOM被认为是副作用,所以我想知道如何以正确的方式

  5. javascript - React-Native-Maps:如何动画协调? - 2

    我正在使用以下代码但没有成功://NativeBase容器内部<MapView.Animatedref="map"style={styles.map}showsUserLocation={true}zoomEnabled={true}showsMyLocationButton={true}showsCompass={true}showScale={true}showsIndoors={true}mapType={this.state.mapTypes[this.state.mapTypeCode]}/>//类的componentDidMount内部navig

  6. javascript - 如何将 Node 可读流转换为 RX 可观察流 - 2

    如果我有一个Nodejs流,例如来自process.stdin或fs.createReadStream,我如何将其转换为RxJsObservable使用RxJs5流?我看到了RxJs-Node有一个fromReadableStream方法,但看起来它已经将近一年没有更新了。 最佳答案 对于任何正在寻找这个的人,根据Mark的建议,我为rxjs5改编了rx-nodefromStream实现。import{Observable}from'rxjs';//Adaptedfromhttps://github.com/Reac

  7. javascript - 路径上特定点上的 SVG 标记中间 - 2

    我得到了一些在Canvas上生成路径的代码。路径对象看起来与此类似:<pathclass="link"d="M450,215.L265,236L225,236"style="stroke-width:1;"></path>在View中(a,b,c字母只是为了说明问题):我的问题是我想在线的中间画一些箭头(标记),在“a”到“b”之间,但是当我创建一个标记并执行标记中间属性时,它会在b点生成。我试图在a和b之间做一些点,但是marker-mid在那里和b点上做了箭头。来自WEBAPI文档:Themarker-midd

  8. javascript - 无法使用 Webpack、Typescript、自定义模块目录找到模块 - 2

    我想做什么我写了一个虚拟模块my-component,它基本上导出了一个类Something。我把它放在app/modules/中。现在我想使用app/app.js中的导入语法来访问它:import{Something}from'my-component';期望:根据我当前的Webpack配置(如下),我希望它能工作。实际:这会引发错误:ERRORin[default]/<project_dir>/app/app.ts:1:26Cannotfindmodule'my-component/Something'.我尝试解决的问题我知道模块本身的定

  9. javascript - linting 和编译有什么区别? - 2

    我知道在Java中有一个编译器可以在您编写错误代码时告诉您。但是Javascript不能那样工作,因为它没有编译器。但是,“linting”javascripts是编译代码的方式吗? 最佳答案 Linting正在解析代码以验证语法和格式是否正确并遵循良好实践。linter会告诉您缩进是否不正确,或者您是否应该在=运算符周围添加空格。如果您的代码包含众所周知的安全漏洞或代码异味,linter也会向您发出警告。编译是解析代码以验证语法是否正确并将代码转换为不同的语言(通常是更快的语言)。那么有什么区别呢?编译:语法验证代码转换为不同的语

  10. javascript - Chart.js 时间刻度 : set min and max on xAxes - 2

    如何在xAxes上设置最小值和最大值?它在yAxes上工作正常,但在xAxes上它没有显示任何行为。我的xAxes使用的是type:'time'。我的xAxis标签也使用了moment对象。但是当我删除类型时间并使用普通数字时它也不起作用。我使用的是Chart.js版本2.2.2。scales:{yAxes:[{ticks:{beginAtZero:false,}}],xAxes:[{type:'time',ticks:{min:moment(1471174953000),max:moment(1473853353000)}}]}Hereisthechart.jsTim

随机推荐

  1. javascript - 如何在 ChartJS 中使用溢出滚动修复图表图例宽度-高度 - 2

    我想为我的元素创建饼图,所以我正在使用ChartJS,但是chartJS存在一些问题,如果我使用10到20个数据字段,那么时间图表看起来不错,但是当我我在一个图表中应用了50到60个以上的数据字段,所以图表看起来比图例小,如果有时数据字段比隐藏的图表多,你只能看到图例,图表就不见了。我想为该图例设置高度或宽度,如果有更多数据,也适用于滚动条。这是供您引用的fiddle链接https://jsfiddle.net/KDM1010/5um78rbk/<canvasid="myChart"width="500"height="300"&g

  2. javascript - Vue (nuxt) 中的全局组件 - 2

    在构建Vue应用程序时,我们在每个模板中重复使用某些Vue组件。我们的网格系统存在于.region、.layout、.grid、.column元素之外。它们都是独立的Vue组件(,...)。我们现在在每个模板中都这样做:importBlMainfrom'~components/frame/main/Main.vue'importBlRegionfrom'~components/frame/region/Region.vue'importBlLayoutfrom'~components/frame/layout/Layout.vue'imp

  3. javascript - Accessibility - React 确保点击事件有按键事件 - 2

    我想确保我所有的onClick事件都在onKeyDown事件旁边。我将使用eslint-plugin-jsx-a11y来确保这一点。但在代码中,这是一种实现这种泛型的方法。我的意思是,一直这样做会很烦人:if(event.keyCode===13){...}如果用户使用onClick中的执行函数,我希望有一种方法可以告诉onKeyDown中的元素。或者类似的解决方案http://www.karlgroves.com/2014/11/24/ridiculously-easy-trick-for-keyboard-accessibility/例如,在Angular方面,我很清楚。让我们寻找

  4. javascript - 函数式编程和 DOM 操作 - 2

    如何在以“函数式”方式编写的脚本中以最“纯粹”的方式操作DOM。例如,如果我只需要更改元素宽度,我应该使用像这样的典型语法:document.querySelector(".class").style.width=...或者编写专门的函数,比如:functionresize(el,w){returnel.style.width=w;}resize(document.querySelector(".class",100));我想,我了解函数式编程的一般概念,但我遇到的所有示例都集中在处理数字或字符串上。操作DOM被认为是副作用,所以我想知道如何以正确的方式

  5. javascript - React-Native-Maps:如何动画协调? - 2

    我正在使用以下代码但没有成功://NativeBase容器内部<MapView.Animatedref="map"style={styles.map}showsUserLocation={true}zoomEnabled={true}showsMyLocationButton={true}showsCompass={true}showScale={true}showsIndoors={true}mapType={this.state.mapTypes[this.state.mapTypeCode]}/>//类的componentDidMount内部navig

  6. javascript - 如何将 Node 可读流转换为 RX 可观察流 - 2

    如果我有一个Nodejs流,例如来自process.stdin或fs.createReadStream,我如何将其转换为RxJsObservable使用RxJs5流?我看到了RxJs-Node有一个fromReadableStream方法,但看起来它已经将近一年没有更新了。 最佳答案 对于任何正在寻找这个的人,根据Mark的建议,我为rxjs5改编了rx-nodefromStream实现。import{Observable}from'rxjs';//Adaptedfromhttps://github.com/Reac

  7. javascript - 路径上特定点上的 SVG 标记中间 - 2

    我得到了一些在Canvas上生成路径的代码。路径对象看起来与此类似:<pathclass="link"d="M450,215.L265,236L225,236"style="stroke-width:1;"></path>在View中(a,b,c字母只是为了说明问题):我的问题是我想在线的中间画一些箭头(标记),在“a”到“b”之间,但是当我创建一个标记并执行标记中间属性时,它会在b点生成。我试图在a和b之间做一些点,但是marker-mid在那里和b点上做了箭头。来自WEBAPI文档:Themarker-midd

  8. javascript - 无法使用 Webpack、Typescript、自定义模块目录找到模块 - 2

    我想做什么我写了一个虚拟模块my-component,它基本上导出了一个类Something。我把它放在app/modules/中。现在我想使用app/app.js中的导入语法来访问它:import{Something}from'my-component';期望:根据我当前的Webpack配置(如下),我希望它能工作。实际:这会引发错误:ERRORin[default]/<project_dir>/app/app.ts:1:26Cannotfindmodule'my-component/Something'.我尝试解决的问题我知道模块本身的定

  9. javascript - linting 和编译有什么区别? - 2

    我知道在Java中有一个编译器可以在您编写错误代码时告诉您。但是Javascript不能那样工作,因为它没有编译器。但是,“linting”javascripts是编译代码的方式吗? 最佳答案 Linting正在解析代码以验证语法和格式是否正确并遵循良好实践。linter会告诉您缩进是否不正确,或者您是否应该在=运算符周围添加空格。如果您的代码包含众所周知的安全漏洞或代码异味,linter也会向您发出警告。编译是解析代码以验证语法是否正确并将代码转换为不同的语言(通常是更快的语言)。那么有什么区别呢?编译:语法验证代码转换为不同的语

  10. javascript - Chart.js 时间刻度 : set min and max on xAxes - 2

    如何在xAxes上设置最小值和最大值?它在yAxes上工作正常,但在xAxes上它没有显示任何行为。我的xAxes使用的是type:'time'。我的xAxis标签也使用了moment对象。但是当我删除类型时间并使用普通数字时它也不起作用。我使用的是Chart.js版本2.2.2。scales:{yAxes:[{ticks:{beginAtZero:false,}}],xAxes:[{type:'time',ticks:{min:moment(1471174953000),max:moment(1473853353000)}}]}Hereisthechart.jsTim