Javascript 从外部视图模型调用knockout.js中的函数

Javascript 从外部视图模型调用knockout.js中的函数,javascript,php,cakephp,knockout.js,Javascript,Php,Cakephp,Knockout.js,我使用的是CakePHP 2.3.8,我试图从knockout.js视图模型中调用一个函数,但是我在理解发生了什么时遇到了一些问题 如果(在PHP中)设置了一个特定的变量,那么我想显示一个div,但是我很难让它工作。当我从PHP代码中调用它时,div不会显示,但是方法中会触发一条警报消息,因此我知道代码正在被访问 <div data-bind = "visible: someDiv"> I'm visible </div> 下面是启动事件序列的PHP代码 ech

我使用的是CakePHP 2.3.8,我试图从knockout.js视图模型中调用一个函数,但是我在理解发生了什么时遇到了一些问题

如果(在PHP中)设置了一个特定的变量,那么我想显示一个div,但是我很难让它工作。当我从PHP代码中调用它时,div不会显示,但是方法中会触发一条警报消息,因此我知道代码正在被访问

<div data-bind = "visible: someDiv">
    I'm visible
</div>
下面是启动事件序列的PHP代码

echo $this->Html->script('knockout-2.3.0');
echo $this->Html->script('viewmodel');

//if the edit variable is set, the "someDiv" should be set to true
if(isset($edit)){
    <script>
        window.vm = new myViewModel();
        window.vm.editing(true); //this will trigger the alert from the subscribe function, but the div doesn't display
    </script>
}
echo$this->Html->script('knockout-2.3.0');
echo$this->Html->script('viewmodel');
//如果设置了编辑变量,“someDiv”应该设置为true
如果(isset($edit)){
window.vm=新的myViewModel();
window.vm.editing(true);//这将触发来自subscribe函数的警报,但不显示div
}
为什么当我从PHP将编辑值更改为true时,div不会显示,但如果我从viewmodel中更改它,它会显示

甚至有可能做我正在尝试的事情吗

编辑

我正在将绑定应用到该JS文件中的viewmodel。我没有在PHP文件中再次应用绑定

“variable is set(在PHP中)”的意思是,数据源来自PHP,尽管最后是JavaScript设置值。我在上面的例子中对它进行了简短的介绍,所以它实际上是这样的(并不是说它有多大区别)

//如果设置了编辑变量,“someDiv”应该设置为true
如果(isset($edit)){
window.vm=新的myViewModel();
window.vm.editing();//这将从subscribe函数触发警报,但不显示div
vm.other();
}
为什么当我从PHP将编辑值更改为true时,div不会显示,但是如果我从viewmodel中更改它,它会显示

我没有看到任何地方您是“从php”设置的,似乎您是从JavaScript设置值。如果
window.vm.editing(true)
正在启动subscribe功能,然后它将成功运行。此时真正的问题是您是否确定只有一个VM实例绑定到DOM?我在代码中没有看到任何地方您正在应用绑定,所以您也可以显示该代码吗

我怀疑你的虚拟机看起来像这样-

function viewModel() {
    // some code
}

ko.applyBindings(new viewModel());
或者正在初始化两次。请记住,您需要引用视图模型的同一实例

window.vm = new myViewModel();
ko.applyBindings(window.vm);

//if the edit variable is set, the "someDiv" should be set to true
if(isset($edit)){
    <script>
        window.vm.editing(true); //this will trigger the alert from the subscribe function, but the div doesn't display
    </script>
}
window.vm=新的myViewModel();
应用绑定(window.vm);
//如果设置了编辑变量,“someDiv”应该设置为true
如果(isset($edit)){
window.vm.editing(true);//这将触发来自subscribe函数的警报,但不显示div
}

我更新了我原来的帖子,以澄清“PHP设置问题”。很抱歉。就能够访问编辑可观察对象而言,我如何从viewmodel外部执行该操作?@user3476345如前所述,问题是您正在两次初始化视图模型。正如我之前提到的,您在JS set
window.vm=new myViewModel()
中调用applyBindings,然后在您的PHP或w/e中尝试设置值,只需使用
window.vm
,而不要新建另一个。感谢您的帮助。
function viewModel() {
    // some code
}

ko.applyBindings(new viewModel());
window.vm = new myViewModel();
ko.applyBindings(window.vm);

//if the edit variable is set, the "someDiv" should be set to true
if(isset($edit)){
    <script>
        window.vm.editing(true); //this will trigger the alert from the subscribe function, but the div doesn't display
    </script>
}