似乎无法使 AngularJS 单向绑定起作用

Can't seem to get AngularJS one-way binding to work

我最近开始使用旧 angular 应用程序的(不是很新的)组件。我正在尝试为 <button/>s 等琐碎的事情制作 some dumb components

出于某种原因,我似乎无法使用一种方式绑定!

difficultyButton 组件中的 level 绑定(在 difficult-button.js 中)总是 returns undefined,但是 onLevelChosen 绑定(再次, in difficulty-button.js) 似乎有 options 组件传递给它的回调。

你们有没有看到我可能哪里出错了?


这里有一个 jsbin link 演示了这个问题:http://jsbin.com/rixukuh/11/edit?html,js

请注意 类 redgreenblue 永远不会被应用,因为它们永远无法获取 vm.level 的值。

此外,无论单击哪个按钮,控制台总是打印出 LEVEL => undefined


完整代码

如果需要更多上下文,这里是完整代码。

options.tpl.html

<div class="full-page-cover">
 <div class="options-grid">
    <!-- some random markup -->
    <div class="buttons-grid">       
        <difficulty-button 
            level="easy"
            on-level-chosen="vm.chooseDifficulty(level)" >
            I'm just here for having fun!
        </difficulty-button>
        <!-- some more `difficulty-buttons` -->
    </div>                    
  </div>
</div>

options.js

import angular from 'angular';
import DifficultyButtonModule from './difficulty-button.js';
import template from './options.tpl.html';

class OptionsController {
   constructor() { /* ... */ }
   chooseDifficulty(level) { /* ... */ }
}

const OptionsModule = angular.module('options', [DifficultyButtonModule.name])

OptionsModule.component('options', {
  template,
  controller: OptionsController,
  controllerAs: 'vm'
});

export default OptionsModule;  

difficulty-button.tpl.html

<button 
    ng-class="[
       'uk-button uk-button-large',
       {
         easy: 'uk-button-default',
         medium: 'uk-button-primary',
         hard: 'uk-button-danger'
       } [ vm.level ]
     ]" 
     ng-click="vm.onLevelChosen({ level: vm.level })"
     ng-transclude>

</button>

difficulty-button.js

import angular from 'angular';
import template from './difficulty-button.tpl.html';

const DifficultyButtonModule = angular.module('difficultyButton', []);                                    
DifficultyButtonModule.component('difficultyButton', {
  template,
  bindings: { 
    level: '<', 
    onLevelChosen: '&' 
  }, 
  controllerAs: 'vm',
  transclude: true
});

export default DiffButtonModule; 

当你这样做时

level="easy"

你在你的范围内绑定了简单的 属性(比如 $scope.easy)。这当然不存在。如果您想直接从 html 绑定字符串值,则需要使用单引号

level="'easy'"

其他关卡也一样。那会很好用。

如果您仍想对对象使用绑定,则需要在您的范围内创建它们。但是因为你只需要一种方式,使用字符串应该可以正常工作

免责声明:我没有接触过组件,所以可能是解释不正确。我刚刚与 angularjs

合作过