Javascript 使用knockout js更改上下文

Javascript 使用knockout js更改上下文,javascript,knockout.js,Javascript,Knockout.js,我很懒,只是在我的博客上贴了一个链接。我正在努力使上下文正确。如果你看小提琴并在输入框中输入任何东西,它将呈现一个带有联系人的模板。您可以将鼠标悬停在它们上方,然后会显示“编辑/删除”,但当我单击它们时,它无法按我希望的方式工作。如果我创建了联系人对象,我可以让它调用removeContact(),但这不是我想要的。我希望它在viewModel上调用removeContact(),但联系人不知道viewModel。显然我只是在玩击倒赛,因为它很有趣。有没有人想过如何让edit和delete调用v

我很懒,只是在我的博客上贴了一个链接。我正在努力使上下文正确。如果你看小提琴并在输入框中输入任何东西,它将呈现一个带有联系人的模板。您可以将鼠标悬停在它们上方,然后会显示“编辑/删除”,但当我单击它们时,它无法按我希望的方式工作。如果我创建了联系人对象,我可以让它调用removeContact(),但这不是我想要的。我希望它在viewModel上调用removeContact(),但联系人不知道viewModel。显然我只是在玩击倒赛,因为它很有趣。有没有人想过如何让edit和delete调用viewModel对象上的removeContact/editContact方法

谢谢大家!

下面是链接:

固定版本:

问题:

  • 首先,您使用
    ${Id}
    访问模板中的联系人Id。Javascript区分大小写,因此它应该是
    ${id}
    (这来自联系人构造函数中的
    This.id

  • 在模板中,要访问当前对象时,请使用
    $data
    。您使用的是
    联系人
    。模板不知道联系人是什么。因此,您将
    viewModel.removeContact(contact)
    更改为
    viewModel.removeContact($data)
    。编辑联系人也一样

  • viewModel
    声明中删除
    var
    。从理论上讲,
    viewModel
    是全局的,也应该由knockoutjs访问,但我认为它与jsiddle有关

  • 固定版本:

    问题:

  • 首先,您使用
    ${Id}
    访问模板中的联系人Id。Javascript区分大小写,因此它应该是
    ${id}
    (这来自联系人构造函数中的
    This.id

  • 在模板中,要访问当前对象时,请使用
    $data
    。您使用的是
    联系人
    。模板不知道联系人是什么。因此,您将
    viewModel.removeContact(contact)
    更改为
    viewModel.removeContact($data)
    。编辑联系人也一样

  • viewModel
    声明中删除
    var
    。从理论上讲,
    viewModel
    是全局的,也应该由knockoutjs访问,但我认为它与jsiddle有关


  • 谢谢你的第一项和第二项。我的主要问题是能否访问viewModel。我知道您可以从viewModel中删除“var”,这将使其成为全局的,但我希望尽可能避免这种情况。knockoutjs上的示例都没有使用“var”。此外,您还可以通过查看有关您的小提琴的一件事来删除这4个窗口,即在Choose Framework下,将其设置为
    onLoad
    ,这将在onLoad运行的函数中执行JavaScript。因此,其中的任何变量都不会具有全局范围。如果您将其更改为
    no wrap(body)
    ,它将简单地将您的JavaScript放在您的body中的脚本标记中。然后,
    var viewModel
    将是全局变量。另外,如果您不能使用全局变量,请查看
    templateOptions
    参数到
    template
    绑定,因为它将允许您传入否则无法访问的属性/方法/对象@RPN:能否将viewModel对象本身作为templateOptions的一部分传递?我们怎么能做到呢<代码>模板选项:{viewModel:this}?我认为在这种情况下,
    this
    将是窗口对象。我知道的唯一方法是嵌套模板并使用$data。因此,当对数组使用foreach时,您将有一个接受整个viewModel的
    main模板
    ,然后在模板选项中使用
    $data
    。我将不得不玩它,看看是否有一个没有中间模板的方法。感谢项目1和项目2的捕获。我的主要问题是能否访问viewModel。我知道您可以从viewModel中删除“var”,这将使其成为全局的,但我希望尽可能避免这种情况。knockoutjs上的示例都没有使用“var”。此外,您还可以通过查看有关您的小提琴的一件事来删除这4个窗口,即在Choose Framework下,将其设置为
    onLoad
    ,这将在onLoad运行的函数中执行JavaScript。因此,其中的任何变量都不会具有全局范围。如果您将其更改为
    no wrap(body)
    ,它将简单地将您的JavaScript放在您的body中的脚本标记中。然后,
    var viewModel
    将是全局变量。另外,如果您不能使用全局变量,请查看
    templateOptions
    参数到
    template
    绑定,因为它将允许您传入否则无法访问的属性/方法/对象@RPN:能否将viewModel对象本身作为templateOptions的一部分传递?我们怎么能做到呢<代码>模板选项:{viewModel:this}?我认为在这种情况下,
    this
    将是窗口对象。我知道的唯一方法是嵌套模板并使用$data。因此,当对数组使用foreach时,您将有一个接受整个viewModel的
    main模板
    ,然后在模板选项中使用
    $data
    。我将不得不使用它,看看是否有一种没有中间模板的方法。