javascript - Knockout Observable 数组没有被观察到?

标签 javascript knockout.js

让我从 a screencast 开始当前的行为。正如您所看到的,当我为用户jbrown添加 Angular 色时,该 Angular 色没有显示在它应该显示的位置!

但是如果我导航到另一个用户,然后返回到 jbrown, Angular 色就会显示!

这是有问题的 ViewModel:

function UsersViewModel() {
  var self = this;
  // data with some removed for brevity
  self.isLoaded = ko.observable(false);
  self.selectedUser = ko.observable();
  self.SelectedUserHasRoles = ko.computed(function () {
    if (self.isLoaded()) {
      return self.selectedUser().roles().length > 0;
    }
    return false;
  });

  self.UserHasAllAvailableRoles = ko.computed(function () {
    if (self.isLoaded()) {
      return self.userAvailableRoles().length === 0;
    }
    return false;
  });

  // isLoaded gets set to true when AJAX call to server
  // is a success and data is returned

  // operations with some removed for brevity
  self.setCurrentUser = function (user) {
    const newRolesArray = self.roles().filter(function (role) {
      return !contains(user.roles(), role);
    });
    self.userAvailableRoles(newRolesArray);
    self.selectedUser(user);
  }

  self.addUser = function () {
    self.users.push(new User({ Username: this.newUsernameText() }));
    self.newUsernameText('');
    self.NewUserFormIsVisible(false);
    self.AddRolesFormIsVisible(true);
    self.setCurrentUser(self.users()[self.users().length - 1]);
  };

  self.addRoleForSelectedUser = function() {
    self.selectedUser().roles().push(new Role({ Name: self.selectedRole().name() }));
    self.AddRolesFormIsVisible(false);
    $.post('http://localhost:23926/admin/acl/addusertorole', { username: self.selectedUser().name(), role: self.selectedRole().name() },
    function () {
      console.log('user role created at db!');
    },
    'json');
  }
}

这里是有问题的 HTML 标记:

<!-- ko if: isLoaded -->
  <!-- ko if: SelectedUserHasRoles() -->
  <div class="roles-wrapper" data-bind="foreach: $root.selectedUser().roles()">
    <div class="role-token" data-bind="text: name()"></div>
  </div>
  <!-- /ko -->
<!-- /ko -->

我的 Observable Angular 色数组必须已填充,因为正如您所见,当我离开和返回时,我可以看到我添加的 Angular 色。

我错过了什么?

最佳答案

您正在尝试将新 Angular 色推送到底层、未跟踪的数组,而不是可观察数组。

self.addRoleForSelectedUser = function() {
    self.selectedUser().roles().push(new Role({ Name: self.selectedRole().name() }));
    ...
}

您只需删除“Angular 色”后面的括号,使其看起来像:

self.selectedUser().roles.push(new Role({ Name: self.selectedRole().name() }));

关于javascript - Knockout Observable 数组没有被观察到?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/43123785/

相关文章:

javascript - 在测试我的 REST API 时,Jasmine 的 afterEach 似乎在 beforeEach 之前运行

javascript - 动态添加一个空白行到html表格

persistence - 使用 Knockoutjs 在回发之间保留 View 模型

javascript - Knockout.js 点击绑定(bind)异常行为

Knockout.js - 无法包装 'with' 、 'foreach' 和其他模板绑定(bind)

javascript - 将 JavaScript 变量传递给 ColdFusion 查询

javascript - 使用 Passport 进行谷歌身份验证: Unable to force the user to pick an account again when he tries to sign-in after the first time

javascript - 在 ngFor 中单击更改特定按钮文本

asp.net-mvc - 使用 ASP.NET MVC 和 MVVM 的页面初始化模式(如 knockoutjs)

javascript - Knockoutjs Handlebars 。单击绑定(bind)到渲染的 JSON 无法按预期工作